私はSystem.Timers
自分のプログラムで使用しています。
私たちが知っているように、各インターバルを処理するために新しいスレッドが作成されOnTimedEvent
ます。
前のスレッドがまだ実行されている場合に、システムに新しいスレッドの作成を強制的に待機させる方法を探しています。
いくつかのOnTimedEvent
メソッドを実行しましたが、メソッドが終了するまで待ちたいと思います
それを行う方法はありますか?
私はSystem.Timers
自分のプログラムで使用しています。
私たちが知っているように、各インターバルを処理するために新しいスレッドが作成されOnTimedEvent
ます。
前のスレッドがまだ実行されている場合に、システムに新しいスレッドの作成を強制的に待機させる方法を探しています。
いくつかのOnTimedEvent
メソッドを実行しましたが、メソッドが終了するまで待ちたいと思います
それを行う方法はありますか?
Elapsed
イベントが発生したときに新しいスレッドが作成されないという意味で、あなたは間違っています。イベントは .NET スレッドプールで発生するため、任意のスレッドが処理します。
必要なことを行う 1 つの方法Stop
は、イベント ハンドラーの開始時にタイマーを使用し、Start
終了したら再びタイマーを使用することです。このような:
var timer = new System.Timers.Timer(1000);
timer.Elapsed += HandleTimerElapsed;
timer.Start();
...
private void HandleTimerElapsed(object s, ElapsedEventArgs e)
{
var t = (System.Timers.Timer)s;
t.Stop();
try {
... do some processing
}
finally { // make sure to enable timer again
t.Start();
}
}
もう 1 つのオプションはAutoReset
、タイマーのプロパティを false に設定することです。このようにして、タイマーは一度だけ発生します。その後、Start
再開したいときに呼び出すことができます。したがって、上記のコードは、先頭に a を含めるように変更され、ハンドラ内でtimer.AutoReset = false;
呼び出す必要はありません。Stop
システムに負荷がかかっている場合、タイマーが再び経過する前にハンドラーが実行されることが保証されない可能性があるという意味で、上記の方法にはおそらく競合状態があるため、これは少し安全です。