这个Timer会从内存中释放出来吗?

时间:2011-02-24 22:10:30

标签: c# .net 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
}

在调用func1()一次之后,func2()从那时起每5秒调用一次,即使我丢失了对我的定时器的引用,因为它的作用域仅限于func1()。这意味着计时器显然仍然在内存中,在调用func1()之后很长时间。我的问题是,如果我将它添加到func2():

void func2(object a, EventArgs b) {
    // Called every 5 seconds once func1() is called

    ((DispatcherTimer)a).Stop()
}

计时器是否会在不久之后通过垃圾收集来获取,或者它会继续留在内存中直到程序退出?如果它留在内存中,我如何手动标记它以进行收集(或做类似的事情)?

我有一个次要问题(如果你愿意回答),如果一个普通的Timer在这种情况下会有完全相同的行为,或者我应该知道有显着差异。

谢谢!

3 个答案:

答案 0 :(得分:7)

Threading.Dispatcher类保留所有活动DispatcherTimers的列表。在Tick事件处理程序中调用Stop()时,将从该列表中删除计时器。现在不再有任何对计时器的引用。它最终将被垃圾收集。哪个没关系,因为没有办法再次启动计时器。毕竟,你没有任何方法可以获得引用,Tick事件处理程序是你的最后一次拍摄。

答案 1 :(得分:0)

根据this,你必须调用stop并删除处理程序。

答案 2 :(得分:0)

基本上DispatcherTimer产生一个新的Thread.So它的范围不能像我们想象的那样定义。你也可以通过特定的方法杀死线程。