2

私のプロジェクト System.Timers.Timerでは、オブジェクトを作成しました。間隔は10分に設定されています。10分ごとに経過イベントが発生します。このイベントハンドラーでは、いくつかのコードを実行しています。

このコードを実行する前に、Enabledプロパティをに等しく設定しています。これfalseは、ハンドラーの実行に次の間隔よりも時間がかかる場合、別のスレッドが経過したイベントを実行するためです。

ここでの問題は、突然Elapsedイベントが停止することです。

私はいくつかの記事を読み、falsegarbagecollectorに設定されたmomentenabledプロパティがタイマーオブジェクトを解放するのではないかと疑っています。

それが正しければ、解決策を教えてください。

以下はサンプルコードです。

public class Timer1
{
    private static System.Timers.Timer aTimer;

    public static void Main()
    {
        // Create a timer with a ten second interval.
        aTimer = new System.Timers.Timer(10000);

        // Hook up the Elapsed event for the timer.
        aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

        // Set the Interval to 10min.
        aTimer.Interval = 600000;
        aTimer.Enabled = true;

        Console.WriteLine("Press the Enter key to exit the program.");
        Console.ReadLine();
    }

    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        aTimer.Enabled = false;

        // excutes some code

        aTimer.Enabled = true;
    }
}
4

2 に答える 2

3

クラスにタイマー オブジェクトを指すフィールドがあるため、GC はタイマー オブジェクトを収集しません。

ただし、コードで例外が発生する可能性があり、これによりEnabledプロパティが再び true にならない可能性があります。これを防ぐには、finallyブロックを使用する必要があります。

private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    aTimer.Enabled = false;
    try
    {
        // excutes some code
    }
    catch(Exception ex)
    {
        // log the exception and possibly rethrow it
        // Attention: never swallow exceptions!
    }
    finally
    {
        aTimer.Enabled = true;
    }
}
于 2013-02-17T10:29:49.943 に答える
0

同期オブジェクトを設定できます。その場合、経過はそのオブジェクトの所有者スレッドでのみ発生し、並行性はありません。同様の質問がここに投稿されています: C# タイマーは別のスレッドで経過しますか?

于 2013-02-17T10:31:18.350 に答える