3

我有这个扩展方法可以在给定的时间间隔后禁用计时器。是否可以保证 GC 不会破坏 disableTimer 变量(此方法中的局部变量)?或者是否有理由说明为什么这段代码会在一小时后工作。

timer.DisableAfter(1.Hours()) :

    public static void DisableAfter(this Timer timer, TimeSpan timeSpan)
    {
        var disableTimer = new Timer(timeSpan.TotalMilliseconds)
            {
                AutoReset = false,
            };

        disableTimer.Elapsed += (sender, e) =>
            {
                timer.Stop();
                disableTimer.Stop();
            };
        disableTimer.Start();
    }
4

2 回答 2

1

没有 garauntee 它是否会被垃圾收集,但如果你不保留对计时器的引用,它肯定有资格收集。

请参阅 Timer 的此 MSDN 页面,进入第一个示例源块,阅读上面的文本,显然是源块本身......这实际上都是关于 Timer 被垃圾收集的。

http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

于 2012-08-13T06:14:09.900 回答
0

我还有一个建议。它更简单,因为它不涉及另一个 Timer。当您在 Elapsed 方法上注册一个处理程序时,将它与另一个处理程序包装起来,该处理程序将保存最后一次触发计时器的时间。当计时器过去时,您首先检查是否已经过了一个小时,如果是 - 您抑制当前执行并取消计时器。

您可以通过 Elapsed 委托的源参数访问计时器对象本身。

于 2012-08-13T06:28:04.770 回答