当没有其他对象引用时,Timer对象是否被GC编辑?

时间:2011-02-10 15:38:27

标签: c# garbage-collection timer

如果没有其他对象引用包含活动Timer(System.Timers.Timer)的对象,是否可以进行垃圾回收?

2 个答案:

答案 0 :(得分:10)

即使您没有在某处存储引用,Timer仍有两种基本方法可供引用:

  • 只要启用了计时器。有一个实际生成事件的底层System.Threading.Timer。 CLR保留一个活动计时器列表,它们的回调委托对象保持Timer引用。

  • 通过Elapsed事件处理程序,如果它不是静态的。这会将Timer实例的生命周期延长到至少包含Elapsed事件处理程序的类对象的生命周期。

这里没有失败模式。获取引用返回计时器的唯一可能方法是通过Elapsed事件处理程序的 sender 参数。如果你禁用了计时器,那么就没有办法获得一个参考,所以它适合于收集对象。

将AutoReset属性设置为false时,一种相当经典的方法可以解决此Timer并导致Elapsed事件丢失。一个非常讨厌的问题是,在没有任何诊断的情况下吞下Elapsed事件处理程序中引发的任何异常。这将绕过您必须在结束时重新启动计时器的呼叫。支持System.Threading.Timer,它没有这个问题。

答案 1 :(得分:1)

是。如果没有引用,即使在运行时,Timer也会被GC。

documentation说:

  

代码包含类级别和Main内部的timer变量的声明。要查看积极的垃圾收集如何影响在长时间运行的方法中声明的计时器,您可以注释掉类级声明并取消注释本地变量。要防止收集计时器,请在Main结束时取消注释GC.KeepAlive方法。