11

可能重复:
同步计时器以防止重叠

我班上有一个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

4

2 回答 2

22

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

object lockObject = new object();

private void ProcessTimerEvent(object state) 
 {
   if (Monitor.TryEnter(lockObject))
   {
     try
     {
       // Work here
     }
     finally
     {
       Monitor.Exit(lockObject);
     }
   }
 }
于 2012-11-07T09:56:48.323 回答
15

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

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

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

于 2012-11-07T09:53:04.150 回答