一旦對象超出範圍,並且沒有其他引用。它最終會被垃圾收集。但這可能不會發生一段時間。所以,定時器可能會持續發射,直到它被事實上的垃圾收集。
這只是一個猜測,不過,因爲我沒有在時刻,以測試它的能力。
UPDATE:
我只是寫了一個小的測試程序,看起來是這樣的:
static void Main(string[] args)
{
SetTimer();
Console.ReadLine();
}
private static void SetTimer()
{
Timer expirationTimer = new Timer(1000);
expirationTimer.Elapsed += (sender, e) => Notify(e);
expirationTimer.Start();
}
private static void Notify(ElapsedEventArgs e)
{
Console.WriteLine(string.Format("Notified! {0}", e.SignalTime));
}
的計時器保持射擊很長一段時間(我最終剛剛結束的程序)。有趣的是,我在主函數中插入了15秒的睡眠時間,然後調用GC.Collect()
並且即使在強制垃圾收集之後定時器仍保持運行,儘管無法保證調用GC.Collect()
實際上會執行任何操作。
我也嘗試在using語句包裹的計時器,並正確地關閉計時器立即(沒有打印任何內容到屏幕)。所以,我相信我的假設是正確的,垃圾收集最終會收集定時器並處理它。但是沒有辦法確定這將是什麼時候。
謝謝。很高興在這方面有具體的答案。 – 2012-01-03 18:08:24