8

C# で次の関数のペアを検討してください。

void func1() {
    DispatcherTimer tmr = new DispatcherTimer();
    tmr.Interval = TimeSpan.FromSeconds(5);
    tmr.Tick += func2;
    tmr.Start();
}

void func2(object a, EventArgs b) {
    // Called every 5 seconds once func1() is called
}

func1() を 1 回呼び出した後、スコープが func1() に制限されているため、タイマーへの参照が失われますが、それ以降は 5 秒ごとに func2() が呼び出されます。つまり、 func1() が呼び出された後も、タイマーは明らかにメモリ内にあり、その機能を実行しています。私の質問は、これを func2() に追加した場合です。

void func2(object a, EventArgs b) {
    // Called every 5 seconds once func1() is called

    ((DispatcherTimer)a).Stop()
}

タイマーはすぐにガベージコレクションによって取得されますか、それともプログラムが終了するまでメモリに残りますか? メモリに残っている場合、コレクション用に手動でマークするにはどうすればよいですか (または同様のことを行う)?

私が持っている二次的な質問 (答えたいと思われる場合) は、通常のタイマーがこの状況でまったく同じ動作をするかどうか、または知っておくべき大きな違いがあるかどうかです。

ありがとう!

4

3 に答える 3

7

Threading.Dispatcherクラスは、すべてのアクティブなDispatcherTimersのリストを保持します。TickイベントハンドラーでStop()を呼び出すと、タイマーはそのリストから削除されます。タイマーへの参照はなくなりました。最終的にはガベージコレクションになります。タイマーを再開する方法がないので、これは問題ありません。結局のところ、参照を取得する方法はもうありません。Tickイベントハンドラーが最後のショットでした。

于 2011-02-24T22:31:33.803 に答える
0

thisによると、停止を呼び出してハンドラーを削除する必要があります。

于 2011-02-24T22:19:27.953 に答える