C# - 你如何停止计时器?
Posted
技术标签:
【中文标题】C# - 你如何停止计时器?【英文标题】:C# - how do you stop a timer? 【发布时间】:2011-06-01 14:41:38 【问题描述】:我知道这听起来很愚蠢,但我已经尝试了一切来停止计时器,但计时器不会停止。我正在开发一款游戏,如果有人能告诉我如何停止计时器,我将不胜感激。
【问题讨论】:
发布您的代码以获得良好的开端。 哪些计时器类?我知道有 4 个,就在 BCL 中。 最重要的是,至少试着告诉我们你试图阻止它的原因。否则,“阅读文档”是唯一有效的答案。 按下顶部的按钮! :P - 请显示一些代码 【参考方案1】:如果您使用的是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.Timers.Timer 在内部使用 System.Threading.Timer 也很有趣,并且 Enable=false 处理内部计时器,并在 Enable=true / Start 上重新创建它():source.dot.net/#System.ComponentModel.TypeConverter/System/…【参考方案2】:因此,如果您使用的是 System.Threading.Timer 类,请添加到前面的答案中, 这将永久停止它,不再有机会使用相同的实例:
timer.Dispose()
否则:
timer.Change(Timeout.Infinite, Timeout.Infinite)
【讨论】:
【参考方案3】:System.Windows.Forms.Timer:timer.Enabled = false;
System.Threading.Timer:timer.Change(Timeout.Infinite, Timeout.Infinite);
System.Timers.Timer:timer.Enabled = false;
或 timer.Stop();
【讨论】:
【参考方案4】:对于 .NET 框架中的每个计时器,计时器可能会在您停止它之前触发,因此您会在停止它之后看到回调。
您需要使用asynchronous callback context 之类的东西:当您希望计时器运行时,将bool
设置为true
,并在您停止计时器时将其设置为false
。然后让你的回调检查你的上下文,看看它是否真的应该运行。
【讨论】:
我很高兴在这里也找到了这些信息。我正在使用,而不是额外的变量,检查定时器回调中是否仍然启用定时器。【参考方案5】:假设您正在使用 System.Windows.Forms.Timer;因为没有明确提及其他任何东西……如果是这样的话……
System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Stop();
【讨论】:
【参考方案6】:取决于计时器。如果它来自线程命名空间,请在需要时处理并重新创建它,或者让您的计时器委托等待重置事件(请参阅msdn)。 System.Timers 命名空间有一个启动和停止方法。
【讨论】:
【参考方案7】:我也多次遇到类似的问题。
//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
)检查,则再次启用它。因此,我通过添加额外的标志检查来防止您的问题。
为了更清楚,请仔细阅读代码和添加的 cmets。希望这会有所帮助。
【讨论】:
以上是关于C# - 你如何停止计时器?的主要内容,如果未能解决你的问题,请参考以下文章