Как определить поток GC Finalizer? - PullRequest
7 голосов
/ 25 ноября 2008

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

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

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

Ответы [ 4 ]

14 голосов
/ 25 ноября 2008

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

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);
}
3 голосов
/ 12 января 2009

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

1 голос
/ 25 ноября 2008

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

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

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

  Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
}
0 голосов
/ 25 ноября 2008

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

...