Che cosa impedisce a un Thread in C# da essere Raccolti?
-
09-06-2019 - |
Domanda
In .NETTO, dopo questo codice, qual è il meccanismo si ferma la Thread
l'oggetto in garbage collection?
new Thread(Foo).Start();
GC.Collect();
Sì, è sicuro supporre qualcosa è un riferimento al thread, mi è stato appena errante che cosa esattamente.Per qualche motivo Riflettore non mi mostra System.Threading
, quindi non posso scavare me (so che microsoft ha rilasciato il codice sorgente per l' .NET framework, non ho a portata di mano).
Soluzione
Il runtime mantiene un riferimento al thread finchè è in esecuzione.Il GC abituato a raccogliere, come qualcuno ancora mantiene riferimento.
Altri suggerimenti
Dipende se il thread è in esecuzione o meno.Se si è appena creata oggetto del Thread e non si avvia, è un normale oggetto gestito, cioèammissibili per GC.Non appena si avvia il filo, o quando si ottiene un oggetto Thread già thread in esecuzione (GetCurrentThread) è un po ' diverso.La "oggetto esposto", gestito Thread, è adesso tenetevi forte di riferimento all'interno di CLR, in modo da ottenere sempre la stessa istanza.Quando termina thread, questo riferimento forte è uscito, e l'oggetto gestito saranno raccolti non appena non ci sono altri riferimenti (ora morto) Thread.
Si tratta di un hard-wired funzione di garbage collector.L'esecuzione di thread non vengono raccolti.
Beh, è sicuro supporre che, se un thread è in esecuzione da qualche parte che c'è un riferimento ad esso in modo non sarebbe sufficiente per interrompere la procedura di garbage collection?
Punto importante da notare: se il thread è contrassegnato con IsBackground=True, da non impedire l'intero processo di uscita
Assegnare il nuovo Thread per un locale di campo?
class YourClass
{
Thread thread;
void Start()
{
thread = new Thread(Foo);
thread.Start();
GC.Collect();
}
}
Garbage Collection raccoglie tutto ciò che non è di riferimenti, in modo che nel tuo codice non c'è campo/variabile che fa riferimento al thread, in modo che saranno raccolti.