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

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会有完全相同的行为,或者我应该知道一个显着的差异.

谢谢!

Han*_*ant 7

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