Как определить поток GC Finalizer?

У меня есть многопоточное приложение.NET (C#), и я хочу знать, работает ли определенный метод внутри потока Finalizer.

Я пытался использовать Thread.CurrentThread.Name, но он не работает (возвращает ноль).

Кто-нибудь знает, как я могу запросить текущий поток, чтобы узнать, является ли он потоком финализатора?

4 ответа

Решение

Лучший способ идентифицировать поток - через его управляемый идентификатор:

Thread.CurrentThread.ManagedThreadId;

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

Образец:

public class ThreadTest {
    public static Thread GCThread;

    ~ThreadTest() {
        ThreadTest.GCThread = Thread.CurrentThread;
    }
}

в вашем коде просто создайте экземпляр этого класса и выполните сборку мусора:

public static void Main() {
    ThreadTest test = new ThreadTest();
    test = null;
    GC.Collect();
    GC.WaitForPendingFinalizers();

    Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
}

Если отладка является опцией, вы можете легко найти ее, используя WinDbg + SoS.dll. !threads Команда отображает все управляемые потоки в приложении, а поток финализатора специально выделяется комментарием.

Код Y Low можно немного улучшить...

public static void Main()
{
  ThreadTest test = new ThreadTest();
  test = null;

  GC.Collect();
  GC.WaitForPendingFinalizers();

  Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
}

Я не думаю, что это возможно даже при использовании API отладки, см. Этот пост в блоге для получения дополнительной информации.

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