C#-如何停止计时器?


76

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


8
发布您的代码以取得良好的开端。
Pabuc 2010年

3
哪个计时器类别?我知道有4个,仅在BCL中。
Oded 2010年

最重要的是,至少要告诉我们您试图阻止它的方式。否则,“阅读文档”是唯一有效的答案。
TomTom 2010年

按下顶部的按钮!:P-请显示一些代码
Rippo 2010年

Answers:


166

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

timer.Enabled = false

如果您正在使用System.Threading.Timer,请使用

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

或使用

timer.Stop(); 

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


37

因此,要添加到先前的答案中,以防万一,如果您使用的是System.Threading.Timer类,这将使其永久停止,而不再有机会使用同一实例:

   timer.Dispose()

除此以外:

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

24

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


8

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

您将需要使用异步回调上下文之类的东西:在希望计时器运行时使用boolset,truefalse停止计时器时将set设置为。然后让您的回调检查您的上下文,以查看它是否应该真正运行。


2
我很高兴在这里也找到了这些信息。我正在使用而不是额外的变量来检查计时器回调中是否仍启用计时器。
熊猫2015年

1

假设您正在使用System.Windows.Forms.Timer; 因为没有明确引用其他任何东西...如果是这种情况...

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

1

取决于计时器。如果它来自线程名称空间,请处置它并在需要时重新创建它,或者让您的计时器委托等待reset事件(请参阅msdn)。System.Timers命名空间具有start和stop方法。


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块中的代码仍在执行。因此,在完成最后的任务之后,如果没有flag(_shouldEnableTimer)检查,则会再次启用它。因此,我通过添加其他标志检查来防止出现您的问题。

为了更清晰,请遍历代码和添加的注释。希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.