GC.SuppressFinalize使对象保持根状态

本文关键字:状态 对象 SuppressFinalize GC | 更新日期: 2023-09-27 18:18:28

在。net中Task.Delay()的参考源代码中,我看到了一段代码:

// ... 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的目的是什么?它是否真的为垃圾收集器根对象,注释是否不正确,还是我误解了其他内容?

GC.SuppressFinalize使对象保持根状态

让System.Threading.Timer扎根当然非常重要,当你不这样做时它会停止滴答。但是不,这种方法有一个非常误导人的名字。它可能在早期版本中做了一些非常不同的事情,然后后来发现它所做的一切都是不必要的。不应该,任务上有一个引用。当然,这是在没有访问早期源代码的情况下的推测。

剩下的是一个微优化,在。net框架代码中没有什么不寻常的。假设定时器总是被处理掉,不管发生什么,所以不需要它的终结器。听起来是对的,您必须考虑一个任务在执行Delay()时遇到异常的场景。这是不可能的。相当草率的编辑,顺便说一句,这在框架代码中并不常见。