GC.SuppressFinalize是否保持对象的根

时间:2015-10-20 15:49:28

标签: c# garbage-collection finalizer

在.NET的Task.Delay()参考源中,我遇到了a snippet of code

// ... and create our timer and make sure that it stays rooted.
if (millisecondsDelay != Timeout.Infinite) // no need to create the timer if it's an infinite timeout
{
    promise.Timer = new Timer(state => ((DelayPromise)state).Complete(), promise, millisecondsDelay, Timeout.Infinite);
    promise.Timer.KeepRootedWhileScheduled();
}

方法KeepRootedWhileScheduledimplemented thusly

GC.SuppressFinalize(m_timer);

致电GC.SuppressFinalize的目的是什么?它真的是垃圾收集器的根对象,注释是不正确的,还是还有其他我误解的东西?

1 个答案:

答案 0 :(得分:2)

保持一个System.Threading.Timer扎根当然非常重要,它会在你不做的时候停止滴答作响。但不,这种方法有一个非常误导的名称。它可能在早期版本中做了一些非常不同的事情,然后后来发现无论它做什么都没有必要。它不应该,任务保持参考。这是猜想,当然无法访问早期的源代码。

剩下的是微优化,在.NET Framework代码中没有什么不寻常之处。据推测,无论发生什么事情,计时器总是被处理掉,所以不需要它的终结器。听起来很对,你必须考虑一个任务在执行Delay()时遇到异常的情况。嗯,这没有发生。相当邋edit的编辑,这在框架代码中并不常见。