Joe*_*ool 8 .net c# garbage-collection dispatchertimer
考虑一下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
}
Run Code Online (Sandbox Code Playgroud)
在调用func1()一次后,func2()从那时起每隔5秒被调用一次,即使我丢失了对我的计时器的引用,因为它的作用域仅限于func1().这意味着计时器显然仍在内存中,在调用func1()之后很长时间.我的问题是,如果我将它添加到func2():
void func2(object a, EventArgs b) {
// Called every 5 seconds once func1() is called
((DispatcherTimer)a).Stop()
}
Run Code Online (Sandbox Code Playgroud)
很快就会通过垃圾收集来获取计时器,还是会继续留在内存中直到程序退出?如果它留在内存中,我如何手动标记它(或做类似的事情)?
我有一个第二个问题(如果你愿意回答)是在这种情况下,如果一个普通的Timer会有完全相同的行为,或者我应该知道一个显着的差异.
谢谢!
Threading.Dispatcher类保留所有活动DispatcherTimers的列表.在Tick事件处理程序中调用Stop()时,将从该列表中删除计时器.现在不再有任何对计时器的引用.它最终将被垃圾收集.哪个没关系,因为没有办法再次启动计时器.毕竟,你没有任何方法可以获得引用,Tick事件处理程序是你的最后一次拍摄.
归档时间: |
|
查看次数: |
1515 次 |
最近记录: |