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

ar.*_*gin 8 .net c# wpf

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

Threading.Timer我班上有一个.

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

并为它定义了一个回调.

private void ProcessTimerEvent(object obj)
{
  if(value)
    MyFunction();
}
Run Code Online (Sandbox Code Playgroud)

运行它时,在myfunction完成之前重新运行回调.

如何暂停Threading.Timer完成myfunction

Iva*_*nko 16

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

object lockObject = new object();

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


Adr*_*ips 10

您可以System.Threading.Timer通过更改间隔来禁用a .你可以通过调用:

timer.Change(Timeout.Infinite, Timeout.Infinite);
Run Code Online (Sandbox Code Playgroud)

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