【问题标题】:How to pause a Threading.timer to complete a function [duplicate]如何暂停 Threading.timer 以完成功能[重复]
【发布时间】:2012-11-07 17:56:48
【问题描述】:

可能重复:
Synchronizing a timer to prevent overlap

我的班上有一个Threading.Timer

 System.Threading.Timer timer;
 TimerCallback cb = new TimerCallback(ProcessTimerEvent);
 timer = new Timer(cb, reset, 1000, Convert.ToInt64(this.Interval.TotalSeconds));

并为它定义了一个回调。

private void ProcessTimerEvent(object obj)
{
  if(value)
    MyFunction();
}

运行时,在myfunction之前重新运行回调以完成。

如何暂停Threading.Timer以完成myfunction

【问题讨论】:

标签: c# .net wpf


【解决方案1】:

不必停止计时器,您可以让计时器继续触发回调方法,但将不可重入代码包装在 Monitor.TryEnter/Exit 中。在这种情况下无需停止/重新启动计时器;重叠调用不会立即获取锁并返回。

object lockObject = new object();

private void ProcessTimerEvent(object state) 
 {
   if (Monitor.TryEnter(lockObject))
   {
     try
     {
       // Work here
     }
     finally
     {
       Monitor.Exit(lockObject);
     }
   }
 }

【讨论】:

  • 感谢您的解决方案。我创建了一个 NonOverlappingTimer 类,使用这种包装 System.Threading.Timer 的模式来保证不重叠的执行:gist.github.com/randyburden/…
【解决方案2】:

您可以通过更改间隔来禁用System.Threading.Timer。你可以通过调用来做到这一点:

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

如果您希望计时器再次继续触发,则必须在完成对 myfunction 的调用后将时间间隔改回来。

【讨论】:

    猜你喜欢
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2022-06-15
    • 2021-08-19
    • 2012-08-21
    • 2017-01-08
    • 2014-02-07
    相关资源
    最近更新 更多