在Task.Delay()在.NET中的参考源代码中,我遇到了代码片段
// ... 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是已如此实施
GC.SuppressFinalize(m_timer);调用GC.SuppressFinalize的目的是什么?它是否真的是垃圾收集器的根对象,评论是否不正确,或者还有什么是我误解的?
发布于 2015-10-20 16:34:06
保持一个System.Threading.Timer根当然是非常重要的,它停止滴答当你不。但是不,这个方法有一个非常误导的名字。在早期版本中,它可能做了一些非常不同的事情,后来发现,不管它做什么,它都是不必要的。它不应该,任务在它上有一个参考。当然,这是一种推测,不需要访问早期的源代码。
剩下的是一个微优化,在.NET框架代码中没有什么不寻常的。想必计时器总是会被处理掉,不管发生什么,所以不需要它的终结器。听起来不错,您必须考虑这样一种情况,即任务在执行Delay()时遇到异常。但那不会发生的。编辑相当草率,这在框架代码中并不常见。
https://stackoverflow.com/questions/33241155
复制相似问题