2008-11-25 16 views
7

Tengo una aplicación multi-hilo .NET (C#) y quiero saber si un determinado método se ejecuta dentro de la cadena Finalizer.¿Cómo identificar el subproceso GC Finalizer?

He intentado usar Thread.CurrentThread.Name pero no funciona (devuelve nulo).

¿Alguien sabe cómo puedo consultar el hilo actual para descubrir si es el hilo de Finalizer?

+0

¿Por qué necesita saber qué hilo ejecuta GC? –

+0

Sí exactamente, ¿por qué? – peterchen

+0

mi fuction ejecuta el código que no quiero ejecutar durante la finalización –

Respuesta

14

La mejor manera de identificar un hilo es a través de su identificador administrado:

Thread.CurrentThread.ManagedThreadId; 

Desde un finalizador siempre se ejecuta en el hilo de la GC puede crear un finalizador que salvará el ID del tema (o el objeto hilo) en un estático valiable.

muestra:

public class ThreadTest { 
    public static Thread GCThread; 

    ~ThreadTest() { 
     ThreadTest.GCThread = Thread.CurrentThread; 
    } 
} 

en su código sólo crea una instancia de esta clase y hacer una recolección de basura:

public static void Main() { 
    ThreadTest test = new ThreadTest(); 
    test = null; 
    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 

    Console.WriteLine(ThreadTest.GCThread.ManagedThreadID); 
} 
0

No creo que eso sea posible incluso utilizando las API de depuración, consulte la publicación del blog this para obtener más información.

1

código de Y baja se podría mejorar ligeramente ...

public static void Main() 
{ 
    ThreadTest test = new ThreadTest(); 
    test = null; 

    GC.Collect(); 
    GC.WaitForPendingFinalizers(); 

    Console.WriteLine(ThreadTest.GCThread.ManagedThreadID); 
} 
3

Si la depuración es una opción, puede encontrarla fácilmente con WinDbg + SoS.dll. El comando !threads muestra todos los subprocesos administrados en la aplicación y el subproceso del finalizador se resalta específicamente con un comentario.

Cuestiones relacionadas