在C#中考虑这对函数:
void func1() {
DispatcherTimer tmr = new DispatcherTimer();
tmr.Interval = TimeSpan.FromSeconds(5);
tmr.Tick += func2;
tmr.Start();
}
void func2(object a, EventArgs b) {
// Called every 5 seconds once func1() is called
}
在调用func1()一次之后,func2()从那时起每5秒调用一次,即使我丢失了对我的定时器的引用,因为它的作用域仅限于func1()。这意味着计时器显然仍然在内存中,在调用func1()之后很长时间。我的问题是,如果我将它添加到func2():
void func2(object a, EventArgs b) {
// Called every 5 seconds once func1() is called
((DispatcherTimer)a).Stop()
}
计时器是否会在不久之后通过垃圾收集来获取,或者它会继续留在内存中直到程序退出?如果它留在内存中,我如何手动标记它以进行收集(或做类似的事情)?
我有一个次要问题(如果你愿意回答),如果一个普通的Timer在这种情况下会有完全相同的行为,或者我应该知道有显着差异。
谢谢!
答案 0 :(得分:7)
Threading.Dispatcher类保留所有活动DispatcherTimers的列表。在Tick事件处理程序中调用Stop()时,将从该列表中删除计时器。现在不再有任何对计时器的引用。它最终将被垃圾收集。哪个没关系,因为没有办法再次启动计时器。毕竟,你没有任何方法可以获得引用,Tick事件处理程序是你的最后一次拍摄。
答案 1 :(得分:0)
根据this,你必须调用stop并删除处理程序。
答案 2 :(得分:0)
基本上DispatcherTimer产生一个新的Thread.So它的范围不能像我们想象的那样定义。你也可以通过特定的方法杀死线程。