没有其他对象引用时,Timer对象是否得到GC?

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

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

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

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

这里没有故障模式。 获取引用返回计时器的唯一可能方法是通过Elapsed事件处理程序的sender参数。 如果禁用计时器,则不再有获取引用的方法,因此适合收集对象。

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

是。 如果没有参考,即使在运行时, Timer也将被GC。

文件说:

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