2008-09-17 4 views
14

Dans .NET, après ce code, quel mécanisme empêche l'objet Thread d'être récupéré?Qu'est-ce qui empêche la collecte d'un thread dans C#?

new Thread(Foo).Start(); 
GC.Collect(); 

Oui, il est sûr de supposer quelque chose a une référence au fil, je viens de promenais quoi exactement. Pour une raison quelconque Reflector ne me montre pas System.Threading, donc je ne peux pas le creuser moi-même (je sais MS a publié le code source pour le framework .NET, je ne l'ai pas à portée de main).

Répondre

14

L'exécution conserve une référence au thread tant qu'il s'exécute. Le GC ne le recueille pas tant que quelqu'un garde cette référence.

0

Eh bien, il est sûr de supposer que si un thread s'exécute quelque part que quelque chose a une référence, cela ne serait pas suffisant pour arrêter le garbage collection?

-3

Affecter le nouveau thread à un champ local?

class YourClass 
{ 
    Thread thread; 

    void Start() 
    { 
    thread = new Thread(Foo); 
    thread.Start(); 
    GC.Collect(); 
    } 
} 

Garbage Collection recueille everyting qui ne sont pas des références, donc dans votre code il n'y a pas de champ/référence variable au fil, il sera recueilli.

+2

Non, ça ne va pas. L'exécution garde une référence. Sinon, un thread en cours serait collecté si vous perdez la référence. – EricSchaefer

2

Il s'agit d'une fonctionnalité câblée de garbage collector. Les threads en cours d'exécution ne sont pas collectés.

0

point important à noter que - si votre fil est marqué avec IsBackground = True, il ne sera pas empêcher le processus de sortir

7

Cela dépend si le fil est en cours d'exécution ou non. Si vous venez de créer un objet Thread et que vous ne l'avez pas démarré, il s'agit d'un objet géré ordinaire, c'est-à-dire éligible pour GC. Dès que vous démarrez thread, ou lorsque vous obtenez l'objet Thread pour le thread déjà en cours d'exécution (GetCurrentThread), il est un peu différent. L '"objet exposé", Thread géré, est maintenant maintenu par une référence forte dans CLR, donc vous obtenez toujours la même instance. Lorsque le thread se termine, cette référence forte est libérée et l'objet géré sera collecté dès que vous n'avez plus aucune référence à Thread (maintenant mort).

Questions connexes