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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top