问题
I have a .NET (C#) multi-threaded application and I want to know if a certain method runs inside the Finalizer thread.
I've tried using Thread.CurrentThread.Name but it doesn't work (returns null).
Anyone knows how can I query the current thread to discover if it's the Finalizer thread?
回答1:
The best way to identify a thread is through its managed id:
Thread.CurrentThread.ManagedThreadId;
Since a finalizer always runs in the GC's thread you can create a finalizer that will save the thread id (or the thread object) in a static valiable.
Sample:
public class ThreadTest {
public static Thread GCThread;
~ThreadTest() {
ThreadTest.GCThread = Thread.CurrentThread;
}
}
in your code just create an instance of this class and do a garbage collection:
public static void Main() {
ThreadTest test = new ThreadTest();
test = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
}
回答2:
If debugging is an option you can easily find it using WinDbg + SoS.dll. The !threads
command displays all managed threads in the application and the finalizer thread is specifically highlighted with a comment.
回答3:
Y Low's code could be improved slightly...
public static void Main()
{
ThreadTest test = new ThreadTest();
test = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
}
回答4:
I don't think that is possible even using the debugging APIs, see this blog post for more info.
来源:https://stackoverflow.com/questions/318462/how-to-identify-the-gc-finalizer-thread