/ /このタイマーはメモリから解放されますか? -c#、. net、ガベージコレクション、dispatchertimer

このタイマーはメモリから解放されますか? - c#、.net、ガベージコレクション、dispatchertimer

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を生成するため、そのスコープは通常考えられるように定義できません。または、特定の方法でスレッドを強制終了することもできます。