6

我刚刚偶然发现了一些使用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 间隔被击中时,该方法将在很久以前结束,并且很可能计时器已被破坏。那么这条线的目的是什么?

4

2 回答 2

4

那么这条线的目的是什么?

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

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

于 2013-06-07T17:03:09.723 回答
1

在这种情况下,这条线没有理由。timer.Enabled唯一有帮助的情况是在和 调用之间有很多代码KeepAlive,例如:

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

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

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

于 2013-06-07T17:03:33.847 回答