在.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();
}
方法KeepRootedWhileScheduled
为implemented thusly:
GC.SuppressFinalize(m_timer);
致电GC.SuppressFinalize
的目的是什么?它真的是垃圾收集器的根对象,注释是不正确的,还是还有其他我误解的东西?
答案 0 :(得分:2)
保持一个System.Threading.Timer扎根当然非常重要,它会在你不做的时候停止滴答作响。但不,这种方法有一个非常误导的名称。它可能在早期版本中做了一些非常不同的事情,然后后来发现无论它做什么都没有必要。它不应该,任务保持参考。这是猜想,当然无法访问早期的源代码。
剩下的是微优化,在.NET Framework代码中没有什么不寻常之处。据推测,无论发生什么事情,计时器总是被处理掉,所以不需要它的终结器。听起来很对,你必须考虑一个任务在执行Delay()时遇到异常的情况。嗯,这没有发生。相当邋edit的编辑,这在框架代码中并不常见。