我的问题很简单,为什么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句柄来保持活跃.阅读此博文: