C# 当没有其他对象引用计时器对象时,计时器对象是否会被GC删除?

C# 当没有其他对象引用计时器对象时,计时器对象是否会被GC删除?,c#,garbage-collection,timer,C#,Garbage Collection,Timer,如果没有其他对象引用包含活动计时器(System.Timers.Timer)的对象,是否可以对其进行垃圾收集?是计时器如果不被引用,即使在运行时也会被GC调用 报告说: 该代码包含类级别和Main内部的计时器变量声明。要了解主动垃圾收集如何影响在长时间运行的方法中声明的计时器,可以注释掉类级声明并取消对局部变量的注释。要防止收集计时器,请取消对Main结尾处的GC.KeepAlive方法的注释 有两种基本方法可以使计时器保持引用状态,即使您没有将引用存储在某个位置: 只要定时器启用。有一个底层

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

是<代码>计时器如果不被引用,即使在运行时也会被GC调用

报告说:

该代码包含类级别和Main内部的计时器变量声明。要了解主动垃圾收集如何影响在长时间运行的方法中声明的计时器,可以注释掉类级声明并取消对局部变量的注释。要防止收集计时器,请取消对Main结尾处的GC.KeepAlive方法的注释


有两种基本方法可以使计时器保持引用状态,即使您没有将引用存储在某个位置:

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

  • 如果不是静态的,则由经过的事件处理程序执行。将计时器实例的生存期至少延长到包含已运行事件处理程序的类对象的生存期

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


当您将AutoReset属性设置为false时,使用此计时器遇到麻烦并丢失已用事件的一种非常经典的方法。一个非常棘手的问题是,在经过的事件处理程序中引发的任何异常都会在没有任何诊断的情况下被吞噬。这将绕过呼叫,您必须在结束时重新启动计时器。请支持System.Threading.Timer,它没有这个问题。

不,这在.NET 2.0中已经修复。试试看。然后文档需要修复:大约是4.5当前文档似乎已经删除了这个错误语句。+1。你知道为什么一个未被引用的
系统.线程.Timer
可以被GC'ed而不是
系统.定时器.Timer
?@Stephen,不知道你的意思。同样的规则,CLR中的活动计时器列表,回调引用目标对象。如果未启用,则可以收集未引用的System.Timers.Timer。我的未引用定期
System.Threading.Timer
是GCed,但我的未引用自动重置
System.Timers.Timer
不是GCed。事件处理程序不引用计时器。你能证实吗?(.NET4.0客户端)@Stephen-这是一个非常不同的问题。你为什么不自己开始呢?请提供证据,说明你如何知道它没有被收集。