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# - 你如何停止计时器?的主要内容,如果未能解决你的问题,请参考以下文章

c# - 如何立即停止计时器

C# 为啥定时器会自动停止

如何等到计时器在java中停止?

C# 计时器的三种使用方法

停止 Lua 中的所有计时器(Garry's Mod)

如何停止 System.Threading.Timer,然后更改其参数并再次运行? [复制]