2017-09-25 89 views
2

所以我知道,因爲Can Timers get automatically garbage collected?問題System.Timers.Timer不會被垃圾收集在第一位。我是否必須停止System.Timers.Timer?

但我的實際問題是 - 我必須停止或處置計時器?

private void CreateTimer() 
{ 
    var timer = new Timer(); 
    timer.Elapsed += TimerElapsed; 
    timer.Interval = 30000; 
    timer.AutoReset = true; 
    timer.Enabled = true; 
} 

我的意思是這個計時器將永遠運行。但是現在我不再需要在Method中創建Timer的對象了。我是否必須停止或處置Timer它被垃圾收集?

+0

stop和dispose之間有區別。在定時器的生命週期中停止計時器將會是人們需要的。 – apomene

+0

您可以自己檢查:在Elapsed中創建類似MesseBox.Show的東西,然後關閉它的所有者,例如通過關閉subWindow。 – sTrenat

+1

我不認爲它會被垃圾收集,直到你調用'dispose'。不管你是否停止計時器。更多在這裏:'在你最後一次引用組件前,總是調用Dispose。否則,直到垃圾回收器調用Component對象的Finalize方法時,它所使用的資源纔會被釋放。「https://msdn.microsoft.com/en-us/library/3cc9y48w(v=vs.110).aspx – Achilles

回答

2

我不認爲它會被垃圾收集,直到你撥打 .Dispose()就可以了。無論你是否定時器 .Stop()

所以看來調用Timer.Stop()或設置Timer.Enabled爲false應該是足夠的,因爲這將要求Timer.Dispose()你。 編號:Timer.Enabled

從MSDN:

總是調用Dispose你釋放你的最後一個引用組件之前。否則,在垃圾回收器調用Component對象的Finalize方法之前,它所使用的資源將不會被釋放。 More here

如果希望它被自動處理掉,然後把該邏輯在一個單獨的方法使用Timer.Elapsed屬性所解釋Here

+1

否 - 「我認爲在你調用'.Dispose()'之前,它不會被垃圾收集。」 - 那是不正確的。如果沒有活引用,則不管是否調用了'.Dispose()',都將被GC'ed。 – Enigmativity

+1

停止計時器已足夠好,不需要顯式Dispose()。這不是必需的,也不是IDisposable的意圖。 Winforms會濫用它,但不會擴展到BCL類。 –

+0

查看Timer類的實現,你是正確的。 'Timer.Stop()'實際上將'Enabled'設置爲false,它調用'timer.Dispose()',因此調用'Timer.Stop()'應該足夠了。我會更新答案。 – Achilles

相關問題