我是否必须停止System.Timers.Timer?

问题描述:

所以我知道,因为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

我不认为它会被垃圾收集,直到你拨打 .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