我有一个.NET(C#)多线程应用程序,我想知道某个方法是否在Finalizer线程内运行。
我尝试过使用Thread.CurrentThread.Name但它不起作用(返回null)。
任何人都知道如何查询当前线程以发现它是否为Finalizer线程?
答案 0 :(得分:14)
识别线程的最佳方法是通过其托管ID:
Thread.CurrentThread.ManagedThreadId;
由于终结器总是在GC的线程中运行,因此您可以创建一个终结器,将线程id(或线程对象)保存在静态值中。
样品:
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);
}
答案 1 :(得分:3)
如果调试是一个选项,您可以使用WinDbg + SoS.dll轻松找到它。 !threads
命令显示应用程序中的所有托管线程,并使用注释专门突出显示终结器线程。
答案 2 :(得分:1)
Y Low的代码可以略微提高......
public static void Main()
{
ThreadTest test = new ThreadTest();
test = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
}
答案 3 :(得分:0)
我认为即使使用调试API也不可能,有关详细信息,请参阅this博文。