我的问题很简单,为什么GC无法弄清楚主要的计时器对象应该与TestTimer和相关的EventHandler中的计时器一起被垃圾收集?
为什么我不断获得console.Writeline输出?
class Program
{
public static void Main()
{
TestTimer timer = new TestTimer();
timer = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Console.ReadKey();
}
}
public class TestTimer
{
private Timer timer;
public TestTimer()
{
timer = new Timer(1000);
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Start();
}
private void timer_Elapsed(Object sender,ElapsedEventArgs args)
{
Console.Write("\n" + DateTime.Now);
}
}
解决方法
不依赖于GC,使用dispose模式正确处理TestTimer(然后应该丢弃Timer).
然而,发生的事情是计时器通过自己获取GC句柄来保持活跃.阅读此博文:
http://nitoprograms.blogspot.com/2011/07/systemthreadingtimer-constructor-and.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+blogspot%2FOlZtT+%28Nito+Programming%29