У меня есть многопоточное приложение .NET (C#), и я хочу знать, работает ли определенный метод внутри потока Finalizer.
Я пробовал использовать Thread.CurrentThread.Name, но он не работает (возвращает значение null).
Кто-нибудь знает, как я могу запросить текущий поток, чтобы узнать, является ли он потоком Finalizer?
моя функция запускает код, который я не хочу запускать во время завершения
Кроме того, это действительно важно? Есть проблема, которую я хочу найти, как решить.
Никогда не следует обижаться, когда кто-то спрашивает «почему вы хотите это сделать» в ответ на вопрос; часто они замечают закономерность и пытаются определить, могут ли они предложить более четкое решение вашей реальной проблемы. Очевидно, это иногда может вас раздражать, если вы [продолжение]
знать, что вы делаете, но вы не должны чувствовать, что они ставят под сомнение ваше суждение.





Я не думаю, что это возможно даже с использованием API отладки, см. Сообщение в блоге это для получения дополнительной информации.
Лучший способ идентифицировать поток - это его управляемый идентификатор:
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);
}
Код Y Low можно немного улучшить ...
public static void Main()
{
ThreadTest test = new ThreadTest();
test = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
}
Если возможна отладка, ее легко найти с помощью WinDbg + SoS.dll. Команда !threads отображает все управляемые потоки в приложении, а поток финализатора выделяется с комментарием.
Зачем вам нужно знать, в каком потоке выполняется сборщик мусора?