Как определить поток 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 отладки, см. Этот пост в блоге для получения дополнительной информации.