C#:动态检查终结器线程是否被阻塞

C#: dynamically check if the finalizer thread is blocked

我想检查是否有一种终结器方法导致终结器线程永远挂起:终结器线程是否处于阻塞状态(如死锁)。

如果不同的 CLR 存在差异,我将专注于 Windows 高于(例如)4.5 的版本的标准 .NET 框架。

我编写了以下代码来测试虚拟对象是否最终确定。我假设:

虚拟对象:

    /// <summary>
    /// Little class to test if the finalizer thread is alive. 
    /// Just runs an action when finalized
    /// </summary>
    private class DummyObject
    {
        /// <summary>
        /// Action to run when finalized
        /// </summary>
        private Action Finalized;

        /// <summary>
        /// Constructor
        /// </summary>
        public DummyObject(Action finalized)
        {
            Finalized = finalized;
        }

        /// <summary>
        /// Finalizer
        /// </summary>
        ~DummyObject()
        {
            Finalized();
        }
    }

主要代码:

            bool finalized = false;
            var obj = new DummyObject(() => finalized = true);
            obj = null;
            GC.Collect();
            Thread.Sleep(1000);
            Console.Write("Finalizer thread is alive: " + finalized);

确切的问题是: 如果此代码显示为真,是否证明终结器线程未被阻塞?

如果你真的、真的需要这样的自我诊断,我宁愿不依赖这样的实现细节(尽管现在 - 非常正确)。我宁愿编写自检 FinalizersStartFinalizersStop ETW/LLTng 事件的逻辑。您可以使用 the help of the TraceEvent library.

轻松完成