C#: динамически проверить, заблокирован ли поток финализатора

Я хочу проверить, не вызвал ли один метод финализатора поток финализатора навсегда: находится ли поток финализатора в заблокированном состоянии (например, в тупике) или нет.

Если есть различия в разных CLR, я сосредоточусь на стандартной платформе.NET для Windows в версиях выше (скажем) 4.5.

Я написал следующее тестирование кода, если фиктивный объект будет завершен. Я предполагаю:

  • есть только один поток финализатора (это правильно?)
  • все финализаторы работают в потоке финализаторов (это правильно?)

Пустой объект:

    /// <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 ответ

Решение

Если вам действительно очень нужна такая самодиагностика, я бы не стал полагаться на такие детали реализации (хотя сейчас - вполне корректно). Я бы лучше написал логику самоконтроля FinalizersStart а также FinalizersStop События ETW/LLTng издаются. Вы можете сделать это легко с помощью библиотеки TraceEvent.

Другие вопросы по тегам