C #: динамически проверить, заблокирован ли поток финализатора - PullRequest
0 голосов
/ 20 ноября 2018

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

Если есть различия в разных 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 Ответ

0 голосов
/ 20 ноября 2018

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

...