Come identificare il thread del finalizzatore GC?
-
11-07-2019 - |
Domanda
Ho un'applicazione multi-thread .NET (C #) e voglio sapere se un determinato metodo viene eseguito all'interno del thread Finalizer.
Ho provato a utilizzare Thread.CurrentThread.Name ma non funziona (restituisce null).
Qualcuno sa come posso interrogare il thread corrente per scoprire se è il thread Finalizer?
Soluzione
Il modo migliore per identificare un thread è attraverso il suo ID gestito:
Thread.CurrentThread.ManagedThreadId;
Poiché un finalizzatore viene sempre eseguito nel thread del GC, è possibile creare un finalizzatore che salverà l'id thread (o l'oggetto thread) in un valore statico.
Esempio:
public class ThreadTest {
public static Thread GCThread;
~ThreadTest() {
ThreadTest.GCThread = Thread.CurrentThread;
}
}
nel tuo codice basta creare un'istanza di questa classe ed eseguire una garbage collection:
public static void Main() {
ThreadTest test = new ThreadTest();
test = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
}
Altri suggerimenti
Se il debug è un'opzione puoi trovarla facilmente usando WinDbg + SoS.dll. Il comando ! Thread
visualizza tutti i thread gestiti nell'applicazione e il thread del finalizzatore viene evidenziato in modo specifico con un commento.
Il codice di Y Low potrebbe essere leggermente migliorato ...
public static void Main()
{
ThreadTest test = new ThreadTest();
test = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(ThreadTest.GCThread.ManagedThreadID);
}
Non penso che sia possibile nemmeno usando le API di debug, vedi questo post sul blog per maggiori informazioni.