【问题标题】:C# - how do you stop a timer?C# - 你如何停止计时器?
【发布时间】:2011-06-01 14:41:38
【问题描述】:

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

【问题讨论】:

  • 发布您的代码以获得良好的开端。
  • 哪些计时器类?我知道有 4 个,就在 BCL 中。
  • 最重要的是,至少试着告诉我们你试图阻止它的原因。否则,“阅读文档”是唯一有效的答案。
  • 按下顶部的按钮! :P - 请显示一些代码

标签: c# .net timer


【解决方案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(); 

【讨论】:

【解决方案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。希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 2015-09-19
            • 1970-01-01
            • 1970-01-01
            • 2012-05-05
            • 2014-08-24
            • 1970-01-01
            • 1970-01-01
            • 2023-04-11
            • 1970-01-01
            相关资源
            最近更新 更多