2

私はSystem.Timers自分のプログラムで使用しています。

私たちが知っているように、各インターバルを処理するために新しいスレッドが作成されOnTimedEventます。

前のスレッドがまだ実行されている場合に、システムに新しいスレッドの作成を強制的に待機させる方法を探しています。

いくつかのOnTimedEventメソッドを実行しましたが、メソッドが終了するまで待ちたいと思います

それを行う方法はありますか?

4

1 に答える 1

2

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システムに負荷がかかっている場合、タイマーが再び経過する前にハンドラーが実行されることが保証されない可能性があるという意味で、上記の方法にはおそらく競合状態があるため、これは少し安全です。

于 2012-04-07T20:05:02.017 に答える