保证GC不会影响代码

时间:2012-08-13 06:06:05

标签: c# garbage-collection extension-methods

我有这种扩展方法在给定间隔后禁用计时器。是否保证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();
    }

2 个答案:

答案 0 :(得分:1)

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

请参阅这个定时器的MSDN页面,转到第一个示例源块,阅读上面的文本,显然是源块本身...它实际上是关于Timer被垃圾收集的所有内容。

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

答案 1 :(得分:0)

我有另一个建议。它更简单,因为它不涉及另一个计时器。 当您在Elapsed方法上注册处理程序时,使用另一个处理程序将其包装,该处理程序将保留上次定时计时的触发器。当计时器过去时,首先检查是否已经过了一个小时,如果是 - 你取消当前执行并取消计时器。

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