Search code examples
.netmultithreadingfinalizer

How to identify the GC Finalizer thread?


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?


Solution

  • 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);
    }