关于GC和事件处理程序的问题

时间:2011-07-08 20:25:55

标签: c# .net garbage-collection

  

可能重复:
  Timer, event and garbage collection : am I missing something ?

如果我有以下代码:

public void SomeMethod()
{
    Timer timer = new Timer();
    timer.Tick += new EventHandler(timer_Tick);
    timer.Start();
}
timer_Tick完成后,{p>会SomeMethod继续被重复调用,即使在任何地方都没有引用计时器吗?

我想也许它会一直调用Timer的Dispose方法。但是,一般来说,GC是否知道某个对象何时尚未处理?

3 个答案:

答案 0 :(得分:2)

与此处的其他答案相反,不,计时器不会被垃圾收集。

在内部,启用计时器将分配一个GCHandle对象,该对象将保留对象,从而保留计时器,从而保存实现事件处理程序的任何对象,直到您禁用它或程序为止结束,以先到者为准。

这已经在SO here: Timer, event and garbage collection : am I missing something ?上得到了解答,所以我将把这个问题作为重复来解决。

答案 1 :(得分:1)

任何地方都没有代码可以引用timer;因此它有资格进行垃圾收集。

timer对象本身引用了您的timer_Tick方法,但这并不重要。它仍然可以收集。

答案 2 :(得分:0)

GC将在下一次抓取时收集它...它就像任何其他对象一样。 计时器引用事件,而不是事件的事件,因此它将是GC'd。