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()
}
タイマーはすぐにガベージコレクションによって取得されますか、それともプログラムが終了するまでメモリに残りますか? メモリに残っている場合、コレクション用に手動でマークするにはどうすればよいですか (または同様のことを行う)?
私が持っている二次的な質問 (答えたいと思われる場合) は、通常のタイマーがこの状況でまったく同じ動作をするかどうか、または知っておくべき大きな違いがあるかどうかです。
ありがとう!