我必须停止 System.Timers.Timer 吗?

Pet*_*ter 5 c# garbage-collection timer

所以我知道因为计时器可以自动收集垃圾吗?一开始System.Timers.Timer就不会被垃圾收集。

但我的实际问题是 - 我是否必须停止或处置计时器?

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

我的意思是这个计时器将永远运行。但是现在我不再需要在方法中创建计时器的对象了。我是否必须停止或处理Timer它被垃圾收集的东西?

Ach*_*les 5

我不认为它会被垃圾收集,直到你调用.Dispose()它。你是否.Stop()是定时器都没有关系。

因此,调用Timer.Stop()或设置Timer.Enabled为 false似乎就足够了,因为这需要Timer.Dispose()您。Ref: Timer.Enabled

来自 MSDN:

在释放对组件的最后一个引用之前,请始终调用 Dispose。否则,在垃圾收集器调用 Component 对象的 Finalize 方法之前,它使用的资源不会被释放。 更多在这里

如果您希望它被自动处理掉,请使用此处所述的Timer.Elapsed属性将该逻辑放在单独的方法中。

  • 停止计时器就足够了,不需要显式的 Dispose()。它从来不是必需的,不是 IDisposable 的本意。Winforms 滥用它,但这并没有扩展到 BCL 类。 (2认同)
  • 我同意不调用`Dispose`对于非关键应用程序可能_好_,但我不得不不同意“从不需要它”。“处理”类似于自己捡垃圾,而不是依靠城市的清洁人员为您做;这是一个好公民所做的。此外,`Enabled` 处理计时器的事实是没有实际意义的:不能保证这会在未来的 .NET 版本中继续发生,或者不会有其他非托管资源添加到需要释放的类中_除了_内部计时器,这是`Dispose`会处理的。 (2认同)