8

考虑 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() 一次后,从那时起每 5 秒调用一次 func2(),即使我失去了对计时器的引用,因为它的范围仅限于 func1()。这意味着在调用 func1() 很久之后,计时器显然仍在内存中,正在做它的事情。我的问题是,如果我将其添加到 func2():

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

    ((DispatcherTimer)a).Stop()
}

计时器会很快被垃圾收集器拾取,还是会继续留在内存中直到程序退出?如果它留在内存中,我如何手动将其标记为收集(或做类似的事情)?

我的第二个问题(如果您愿意回答的话)是常规计时器在这种情况下是否会具有完全相同的行为,或者我应该知道是否存在显着差异。

谢谢!

4

3 回答 3

7

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

于 2011-02-24T22:31:33.803 回答
0

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

于 2011-02-24T22:19:27.953 回答
0

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

于 2013-03-23T14:13:16.613 回答