Question

Dans .NET, après ce code, quel mécanisme empêche l'objet Thread d'être récupéré?

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

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

Était-ce utile?

La solution

Le moteur d'exécution garde une référence au thread tant qu'il est en cours d'exécution. Le GC ne le collectera pas tant que quelqu'un conservera cette référence.

Autres conseils

Cela dépend si le thread est en cours d'exécution ou non. Si vous venez de créer un objet Thread sans le démarrer, 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 un objet Thread pour un thread déjà en cours d'exécution (GetCurrentThread), il est un peu différent. Le thread "objet exposé", géré, est maintenant en attente d'une référence forte dans le CLR, de sorte que vous obtenez toujours la même instance. Lorsque le thread se termine, cette référence forte est publiée et l'objet géré est collecté dès que vous ne disposez d'aucune autre référence à un thread (maintenant mort).

C’est une fonctionnalité câblée du ramasse-miettes. Les threads en cours d'exécution ne sont pas collectés.

Eh bien, il est prudent de supposer que si un fil de discussion tourne quelque part, quelque chose y fait référence, cela ne suffirait-il pas pour arrêter le ramassage des ordures?

Un point important à noter cependant - si votre fil de discussion est marqué avec IsBackground = True, cela n'empêchera pas l'ensemble du processus de quitter

Attribuer le nouveau thread à un champ local?

class YourClass
{
  Thread thread;

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

Garbage Collection collecte tout ce qui n'est pas une référence. Ainsi, dans votre code, il n'y a pas de champ / variable référençant le thread, il sera donc collecté.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top