引用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中有自定义计时器,但我想这不会有任何区别吗?
答案 0 :(得分:1)
当DispatcherTimer
正在运行时,Dispatcher
会引用它,并且不会获得GCed。一旦计时器停止和,就没有外部参考,可以收集它。也就是说,如果您对计时器和回调的唯一引用是在计时器和回调中,并且计时器停止,则可以收集计时器。
您可以通过查看Reflector(或您最喜欢的反编译器)并看到计时器在其启动函数中调用_dispatcher.AddTimer(this);
并在其停止时调用_dispatcher.RemoveTimer(this);
来告知调度程序对正在运行的计时器的引用功能