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

时间:2018-11-20 14:32:59

标签: c# multithreading garbage-collection finalizer

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

如果不同的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);

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

1 个答案:

答案 0 :(得分:1)

如果您确实需要这种自我诊断,我宁愿不依赖于此类实现细节(尽管现在-非常正确)。我宁愿编写发出自检FinalizersStartFinalizersStop ETW / LLTng事件的逻辑。您可以使用the help of the TraceEvent library轻松做到这一点。