如何暂停Threading.timer来完成一个函数

时间:2012-11-07 09:36:37

标签: c# .net wpf

  

可能重复:
  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

2 个答案:

答案 0 :(得分:15)

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

object lockObject = new object();

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

答案 1 :(得分:10)

您可以通过更改间隔来停用System.Threading.Timer。您可以通过以下方式执行此操作:

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

如果您希望计时器再次继续发射,则必须在调用myfunction后更改时间间隔。