7

次のコードでは、 aTimerが関数内で宣言されており、Elapsedイベントもサブスクライブしています。

    void StartTimer()
    {
        System.Timers.Timer timer = new System.Timers.Timer(1000);
        timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
        timer.AutoReset = false;
        timer.Start();
    }

関数が完了すると、 への参照Timerは失われます (推測します)。

オブジェクトが破棄されると、イベントは自動的に登録解除されますか?Elapsedそうでない場合、Elapsed イベント自体でイベントの登録を解除できますか?

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        var timer = (System.Timers.Timer)sender;
        timer.Elapsed -= timer_Elapsed;
    }

このアプローチでは、オブジェクトの適切なクリーンアップが引き続き許可されますか、またはこの理由で関数のローカル スコープでタイマーを宣言しないでください。

4

2 に答える 2

2

タイマーを破棄するだけです:

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    var timer = (System.Timers.Timer)sender;
    timer.Dispose(); //here
}

イベントのフックを解除する必要はありません。これは、慣例により、破棄は常に完全な破棄であるためです。

ところで、あなたがそこに書いたことはすべて次と同等です:

await Task.Delay(1000);
于 2014-07-18T10:46:53.493 に答える