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回呼び出した後、func2()が呼び出されますスコープがfunc1()に制限されているため、タイマーへの参照が失われても、それ以降は5秒ごとにこれは、タイマーがfunc1()が呼び出された後もずっと、明らかにメモリに残っていることを意味します。私の質問は、これをfunc2()に追加すると:
void func2(object a, EventArgs b) {
// Called every 5 seconds once func1() is called
((DispatcherTimer)a).Stop()
}
タイマーはガベージコレクションによって取得されますすぐに、またはプログラムが終了するまでメモリにとどまり続けますか?メモリ内に残っている場合、手動で収集するようにマークするにはどうすればよいですか?
私が持っている二次的な質問(答えたいと思う場合)は、通常のタイマーがこの状況でまったく同じ動作をするかどうか、または知っておくべき重要な違いがあるかどうかです。
ありがとう!
回答:
回答№1の場合は7スレッド。Dispatcherクラスは、すべてのアクティブなDispatcherTimersのリストを保持します。 TickイベントハンドラーでStop()を呼び出すと、タイマーがそのリストから削除されます。タイマーへの参照はなくなりました。最終的にはガベージコレクションになります。タイマーを再び開始する方法がないため、これは問題ありません。結局、参照を取得する方法はもうありません。Tickイベントハンドラーが最後のショットでした。
回答№2の場合は0
による この、「stop」を呼び出してハンドラーを削除する必要があります。
回答№3の場合は0
基本的に、DispatcherTimerは新しいThread.Spawnを生成するため、そのスコープは通常考えられるように定義できません。または、特定の方法でスレッドを強制終了することもできます。