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間隔を変更することで、を無効にすることができます。あなたは呼び出すことによってこれを行うことができます:

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

myfunctionタイマーを再度起動したい場合は、呼び出しが終了したら間隔を元に戻す必要があります。

于 2012-11-07T09:53:04.150 に答える