垃圾收集器KeepAlive方法如何与计时器一起使用?

时间:2013-06-07 16:56:28

标签: c# garbage-collection

我偶然发现了一些使用GC.KeepAlive()方法的代码,我试图了解它是如何工作的。例如,在此代码中:

Timer timer = new System.Timers.Timer(5000);
timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
timer.Enabled = true;
GC.KeepAlive(timer);

在这段代码中,我的理解是创建了一个Timer对象,它产生一个每5秒运行一次的线程。接下来,运行GC线。然后该方法退出,在垃圾收集运行时销毁计时器。

KeepAlive只会在调用KeepAlive之前保持活动状态,它看起来对我来说大概是0.0000001秒并且它不会被破坏,因为它有一个本地引用它(除非它正在破坏它因为没有别的发生在计时器对象?)

无论哪种方式,当5000间隔被击中时,该方法将在很久以前结束,并且很可能计时器被破坏。那么这条线的目的是什么?

2 个答案:

答案 0 :(得分:4)

  

那条线的目的是什么?

无。你不应该使用它,因为它没有帮助任何东西。该代码可能是由不熟悉Timer类如何工作的人编写的。

在内部,Timer类将使用完全不同的方法来确保它不应该在它应该被垃圾收集之前收集。有关详细信息,请参阅this question

答案 1 :(得分:1)

在这种情况下,没有理由这样做。它唯一可以帮助的是timer.EnabledKeepAlive之间的代码之间是否存在大量代码,如:

    timer.Enabled = true;
    // lots of code here that does
    // things that take some time
    GC.KeepAlive(timer);
}

这将阻止垃圾收集器在方法结束之前收集计时器。如果没有KeepAlive的调用,GC可能会在设置timer后决定Enabled不再使用,并且可以进行早期收集。

如果你想要一个持久计时器,你必须在类范围内声明它。