【问题标题】:Do I have to stop System.Timers.Timer?我必须停止 System.Timers.Timer 吗?
【发布时间】:2017-09-25 12:35:59
【问题描述】:

所以我知道因为问题Can Timers get automatically garbage collected?System.Timers.Timer 不会被垃圾收集。

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

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

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

【问题讨论】:

  • 停止和处置是有区别的。在计时器的生命周期中,有人会需要停止计时器
  • 您可以自己检查:在 Elapsed 上创建类似 MesseBox.Show 的内容,然后杀死它的所有者,例如通过关闭 subWindow。
  • 我不认为它会被垃圾收集,直到你打电话给dispose。不管你是否stop 计时器。更多:Always call Dispose before you release your last reference to the Component. Otherwise, the resources it is using will not be freed until the garbage collector calls the Component object's Finalize method.msdn.microsoft.com/en-us/library/3cc9y48w(v=vs.110).aspx
  • @Achilles - 不能保证有一个 Finalize 方法,或者它是否写得正确,或者它是否被调用。规则应该是始终明确调用.Dispose()
  • @Enigmativity 我同意,应该始终明确地调用.Dispose(),但在这种情况下Timer 继承自Component,它提供了`Finalize()' 的实现,所以文档是正确的。参考:msdn.microsoft.com/en-us/library/az5741fh(v=vs.110).aspx

标签: c# timer garbage-collection


【解决方案1】:

我认为在你调用.Dispose() 之前它不会被垃圾回收。不管你是否.Stop() 计时器。

所以看来调用Timer.Stop() 或将Timer.Enabled 设置为false 就足够了,因为那会为你调用Timer.Dispose()。 参考:Timer.Enabled

来自 MSDN:

始终在释放对组件的最后引用之前调用 Dispose。否则,在垃圾收集器调用 Component 对象的 Finalize 方法之前,它正在使用的资源不会被释放。 More here

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

【讨论】:

  • 否 - “我认为在您调用 .Dispose() 之前不会对其进行垃圾收集。” - 这是不正确的。如果没有实时引用,无论是否调用了 .Dispose(),它都会被 GC。
  • 停止计时器就足够了,不需要显式的 Dispose()。它从来都不是必需的,而不是 IDisposable 的本意。 Winforms 滥用了它,但这并没有扩展到 BCL 类。
  • 看看 Timer 类的实现,你是对的。 Timer.Stop() 实际上将Enabled 设置为false,即调用timer.Dispose(),所以调用Timer.Stop() 就足够了。我会更新答案。
  • 我同意不调用 Dispose 对于非关键应用程序可能足够好,但我不得不不同意“它从来不需要”。 Dispose类似于自己捡垃圾,而不是依靠城市的清洁人员为你做;这是一个好公民所做的。此外,Enabled 处理计时器的事实没有实际意义:不能保证这会在未来的 .NET 版本中继续发生,或者不会有其他非托管资源添加到需要释放的类中除了内部计时器,这是Dispose 将负责的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 2019-09-08
相关资源
最近更新 更多