はじめに
C#プログラムで定期的にタイマイベントを呼んでいて、コールバックメソッド内で設定タイマの時間を超えてしまったようなとき、コールバックが重複してしまいます。ここでは重複を避ける方法について忘備録として残しておきます。
具体的には
System.Threading.Timerを利用する際に、コールバックメソッド内で時間がかかる処理があったりすると、そのコールバックが呼び出されたりします。
たとえば、コールバックの呼び出し間隔が500ミリ秒ごとであった場合に、処理自体が700ミリ秒かかってしまったようなときです。
サンプルプログラム
private void Window_Loaded(object sender, RoutedEventArgs e)
{
:
// 定期監視タイマ開始
// 普通にスレッドタイマーを作成し、コールバックの呼び出し間隔を無効に
// した状態でタイマーを開始させる.
var timer = new System.Threading.Timer(new TimerCallback(Timer_Tick));
timer.Change(0, Timeout.Infinite);
}
void Timer_Tick(object state)
{
Int32 ticktime = 500; // 初期監視サイクル
:
// コールバックの重複を避けるため
// サイドChangeコマンドを呼び出して次のコールバックを設定する
var timer = state as System.Threading.Timer;
timer.Change(ticktime, Timeout.Infinite);
}