C# - 你怎么停止计时器?

时间:2010-12-30 15:11:01

标签: c# .net timer

我知道这听起来很愚蠢,但我已经尝试了一切来停止计时器,但计时器不会停止。我正在做一个游戏,如果有人能告诉我如何停止计时器,我将不胜感激。

7 个答案:

答案 0 :(得分:134)

如果您使用System.Timers.Timer,可以像这样停止

timer.Enabled = false

如果您使用的是System.Threading.Timer,请使用此

timer.Change(Timeout.Infinite , Timeout.Infinite)

或使用

timer.Stop(); 

如果您使用System.Windows.Forms.Timer

答案 1 :(得分:29)

因此,要添加到以前的答案,以防您使用System.Threading.Timer类, 这将永久停止它,不再有机会使用相同的实例:

   timer.Dispose()

否则:

  timer.Change(Timeout.Infinite, Timeout.Infinite)

答案 2 :(得分:20)

System.Windows.Forms.Timer:timer.Enabled = false;
System.Threading.Timer:timer.Change(Timeout.Infinite, Timeout.Infinite);
System.Timers.Timer:timer.Enabled = false;timer.Stop();

答案 3 :(得分:5)

对于.NET框架中的每个计时器,计时器可能会在您停止之前触发,因此您在停止后会看到回调。

您需要使用asynchronous callback context之类的内容:当您希望定时器运行时,使用bool设置为true,并在您启用时将其设置为false停下来。然后让你的回调检查你的上下文,看它是否真的应该运行。

答案 4 :(得分:1)

假设您正在使用System.Windows.Forms.Timer;因为没有明确提及其他任何事情......如果是这样的话......

System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Stop(); 

答案 5 :(得分:1)

取决于计时器。如果它来自线程命名空间,则处理它并在需要时重新创建它,或让你的计时器委托等待重置事件(参见msdn)。 System.Timers命名空间有一个启动和停止方法。

答案 6 :(得分:1)

我也多次遇到类似的问题。

//Timer init.
 var _timer = new System.Timers.Timer
{
    AutoReset = true, 
    Enabled = true,
    Interval = TimeSpan.FromSeconds(15).TotalMilliseconds //15 seconds interval
};
 _timer.Elapsed += DoSomethingOnTimerElapsed;


//To be called on timer elapsed.
private void DoSomethingOnTimerElapsed(object source, ElapsedEventArgs e)
{
    //Disable timer.
    _timer.Enabled = false; //or _timer.Stop()
    try
    {
        //does long running process
    }
    catch (Exception ex)
    {

    }
    finally
    {
        if (_shouldEnableTimer) //set its default value to true.
            _timer.Enabled = true; //or _timer.Start()
    }
}


//somewhere in the code if you want to stop timer:
_timer.Enabled = _shouldEnableTimer = false;

//At any point, if you want to resume timer add this:
_timer.Enabled = _shouldEnableTimer = true;

为什么这样做?

让我们假设,try块中的代码会花费更多时间。因此,在禁用计时器(_timer.Enabled = false or _timer.Stop())时,很有可能try块中的代码仍在执行。因此,在完成最后的任务后,如果没有标志(_shouldEnableTimer)检查,则会再次启用。因此,我通过添加其他标志检查来防止出现您的问题。

为更清楚起见,请遍历代码和添加的注释。希望这会有所帮助。