附加了事件的对象是否有资格进行垃圾回收?

时间:2011-06-14 02:58:00

标签: c#-3.0 garbage-collection

引用C#语言规范3.9:

  

“2。如果任何可能的对象或其任何部分都无法访问   继续执行,除了   运行析构函数,对象   被认为不再使用,它   有资格被毁......

例如,在Tick事件触发之前,DispatcherTimer是否有资格进行垃圾收集?

    public void DispatchCallbackAfter(Action callback, TimeSpan period)
    {
        DispatcherTimer timer = new DispatcherTimer(DispatcherPriority.Normal, AppSettings.MainWindow.Dispatcher);
        timer.Tick += new EventHandler(DispatchCallback);
        timer.Interval = period;
        timer.Tag = new object[] {timer, callback};
        timer.Start();
    }

    private void DispatchCallback(object sender, EventArgs args)
    {
        DispatcherTimer t = (DispatcherTimer)sender;
        t.Stop();
        ((Action)((object[])t.Tag)[1])();
    }

注意:在timer.Tag中有自定义计时器,但我想这不会有任何区别吗?

1 个答案:

答案 0 :(得分:1)

DispatcherTimer正在运行时,Dispatcher会引用它,并且不会获得GCed。一旦计时器停止,就没有外部参考,可以收集它。也就是说,如果您对计时器和回调的唯一引用是计时器和回调中,并且计时器停止,则可以收集计时器。

您可以通过查看Reflector(或您最喜欢的反编译器)并看到计时器在其启动函数中调用_dispatcher.AddTimer(this);并在其停止时调用_dispatcher.RemoveTimer(this);来告知调度程序对正在运行的计时器的引用功能