[英]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.