3

与えられた間隔の後にタイマーを無効にするこの拡張メソッドがあります。GCがdisableTimer変数(このメソッドのローカル変数)を破棄しないという保証はありますか?または、このコードが今から1時間で機能する理由はありますか。

timer.DisableAfter(1.Hours()) :

    public static void DisableAfter(this Timer timer, TimeSpan timeSpan)
    {
        var disableTimer = new Timer(timeSpan.TotalMilliseconds)
            {
                AutoReset = false,
            };

        disableTimer.Elapsed += (sender, e) =>
            {
                timer.Stop();
                disableTimer.Stop();
            };
        disableTimer.Start();
    }
4

2 に答える 2

1

ガベージコレクションされるかどうかの保証はありませんが、タイマーへの参照を保持しない場合は、確実にガベージコレクションの対象になります。

タイマーについては、このMSDNページを参照してください。最初のソースブロックの例に移動し、上記のテキストと明らかにソースブロック自体を読んでください...実際には、タイマーがガベージコレクションされていることがすべてです。

http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

于 2012-08-13T06:14:09.900 に答える
0

別の提案があります。別のタイマーを使用しないため、より簡単です。Elapsedメソッドにハンドラーを登録するときは、タイマーが最後に起動したときに保持する別のハンドラーでラップします。タイマーが経過したら、最初に1時間経過したかどうかを確認し、経過した場合は現在の実行を抑制してタイマーをキャンセルします。

Elapsedデリゲートのソースパラメータを介してタイマーオブジェクト自体にアクセスできます。

于 2012-08-13T06:28:04.770 に答える