2

私は、時間間隔ごとにジョブをスケジュールするタイマーを備えた Windows サービスに取り組んでいます。タイマー経過イベントが複数回発生しているようです。

ここにコードサンプルがあります:

private static System.Timers.Timer _timer = new System.Timers.Timer();

protected override void OnStart(string[] args)
{
      _timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
      _timer.Interval = 1000;
      _timer.Enabled = true;
      _timer.Start();
}

private void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
{
      _timer.Enabled = false;
      _timer.Stop();

      //Do the job

      _timer.Enabled = true;
      _timer.Start();
}

手伝って頂けますか?ありがとうございました

4

1 に答える 1

1

Elapsed イベントを発生させるシグナルは、常に ThreadPool スレッドで実行するためにキューに入れられるため、イベント処理メソッドが 1 つのスレッドで実行されると同時に、Stop メソッドの呼び出しが別のスレッドで実行される可能性があります。これにより、Stop メソッドが呼び出された後に Elapsed イベントが発生する可能性があります。次のセクションのコード例は、この競合状態を回避する 1 つの方法を示しています。

引用元: Timer.Stop メソッド. ページのコード サンプルを参照してください。

于 2013-01-14T14:55:02.230 に答える