繁体   English   中英

C# - 你如何停止计时器?

[英]C# - how do you stop a timer?

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

如果您使用System.Timers.Timer停止由以下选项之一执行:

//options 1
timer.Enabled = false
//option 2
timer.Stop()

如果您使用System.Threading.Timer ,请使用此方法

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

如果您使用System.Windows.Forms.Timer ,请使用此方法

timer.Stop(); 

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

   timer.Dispose()

否则:

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

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

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

您需要使用诸如异步回调上下文之类的东西:当您希望计时器运行时,将bool设置为true ,并在停止时将其设置为false 然后让你的回调检查你的上下文,看看它是否真的应该运行。

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

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

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

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

//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 )检查,则再次启用它。 因此,我通过添加额外的标志检查来防止您的问题。

为了更清楚,请仔细阅读代码和添加的注释。 希望这会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM