Question

Supposons que j'ai un code comme suit:

int Main()
{
    if (true)
    {
       new Thread(()=>
          {
              doSomeLengthyOperation();
          }).Start();
    }
    while (true)
    {
       //do nothing
    }
}

Il y a 2 fils, je vais appeler le thread principal le thread qui exécute la fonction principale (), et le fil étant new'ed à l'intérieur du « si » comme fil A.

Ma question est, quand ne se détruit Discussion A? Est-ce doSomeLenghtyOperation () être en mesure d'exécuter en fin?

Comme il n'y a pas de références pointant au fil A, il sera marqué comme candidat pour la collecte des ordures:

  1. Immédiatement après la "nouvelle discussion (). Start ()" déclaration elle-même se termine?
  2. Immédiatement après la "si (true)" portée est quittée?
  3. Après la doSomeLengthOperation () fonctionne à la fin?
  4. Jamais?

Tous les exemples que je vois sont les principaux () tenant la référence, puis le fil principal en attendant de se joindre à un fil avant de quitter. Je suis curieux de ce que la durée de vie du code ci-dessus est.

Merci à l'avance!

Était-ce utile?

La solution

L'objet Thread sera admissible à la collecte des ordures dès qu'il est pas utilisé plus, à savoir immédiatement après avoir appelé la méthode Start. (Il ne sera cependant pas immédiatement recueilli, comme le garbage collector fonctionne à des moments précis.)

Le fil réelle est cependant ne se fie pas l'objet Thread, et continuera à fonctionner même si l'objet Thread est recueilli.

Si le fil est toujours en cours lorsque les sorties principales de la méthode, l'application ne sera pas fin jusqu'à ce que le finalise de fil, à moins que vous avez marqué le fil à un fil d'arrière-plan.

Autres conseils

mot "fil" pourrait signifier plusieurs choses ici:

  • System.Threading.Thread objet (créé par new Thread()),
  • fil CLR (fil géré),
  • thread OS (thread non géré).

objet Thread sera candidat à la méthode GC, dès que début () se termine, car il n'y a plus de références à elle.

thread géré va rester en vie tout en doSomeLengthyOperation () fonctionne.

article par James Kovacs, Microsoft MVP :

  

La durée de vie d'un thread géré est   indépendante de l'objet Thread qui   crée, une très bonne chose donnée   que vous ne voudriez pas le GC à   mettre fin à un fil qui était encore   faire un travail simplement parce que vous avez perdu tout   références à la discussion associée   objet. Ainsi, le GC recueille les   objet de cette discussion, mais pas le réel   thread managé.

L'article contient également quelques exemples de code utiles si vous voulez vous expérimenter.

fil du système d'exploitation, en théorie, n'a pas de one-to-one relation avec des fils gérés. De MSDN :

  

... un hôte sophistiqué peut utiliser l'API d'hébergement CLR pour planifier plusieurs threads gérés sur le même fil de système d'exploitation ou de déplacer un thread managé entre les différents threads du système d'exploitation.

Dans la pratique, cependant, enfilez CLR cartes directement, aujourd'hui de fil de Windows.

  

ne soit détruit le thread A?

Lorsque se termine doSomeLengthyOperation.

  

Will doSomeLenghtyOperation () être en mesure d'exécuter dans l'achèvement

Oui, même si le thread principal existe parce qu'il est pas un fil d'arrière-plan. Si vous définissez le IsBackground propriété à true avant à partir du fil lorsque existe le thread principal, ce fil sera également arrêté.

Ceci est une excellente question! Fil se terminera sûrement et vous pouvez essayer vous-même. Mais il peut être intéressant si vous appelez GC.Collect () dans le temps. Selon C # de Richter via CLR, il sera ramasse-miettes.

UPDATE

Je crois que ce ne sera pas le ramasse-miettes depuis Thread.currentThread il conserve dans la mémoire en ayant une référence.

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