Lors de la création d'une nouvelle instance System.thread, la valeur par défaut du Merci pour les réponses rapides. P>
Je fournis des fonctionnalités dans le destructeur de mon composant pour permettre au fil de mettre fin à la gracefully. J'utilise un Je comprends parfaitement que permettre au fil de finir gracieusement est correct et approprié.
Ce que je ne conceptuelle pas, c'est pourquoi. Par défaut, un thread doit accrocher une application complète s'il ne se termine pas avec succès lorsque l'application est en train de sortir. P> isbackground code> est false. Quelqu'un peut-il perdre la lumière pourquoi ce serait la valeur par défaut ne serait pas vrai. Mon inclination, correct ou non, lors de la création d'un thread, il serait exécuté dans l'arrière-plan du fil principal. P>
ManualResetEvent code> et rejoindre code>. P>
5 Réponses :
Au lieu de cela, l'application doit signaler le fil pour terminer, attendre jusqu'à ce qu'il l'ait fait, puis fermez correctement. P>
C'est mon résumé de ce texte de Blurb à partir du Un thread est soit un fil d'arrière-plan
ou un fil de premier plan. Fond
Les fils sont identiques au premier plan
fils, sauf que ce fond
Les threads n'empêchent pas un processus de
terminer. Une fois tout au premier plan
Les threads appartenant à un processus ont
terminé, la langue commune
Le temps d'exécution termine le processus. Quelconque
Les fils de fond restants sont
arrêté et ne complète pas. P>
blockQuote> isbackground code> signifie que le thread est Thread.isbackground code> Article MSDN : P>
Ces informations de la page MSDN sur Isbackground code> explique la différence entre fond d'arrière-plan et fils de premier plan. P>
Un thread est soit un fil d'arrière-plan, soit un fil de premier plan. Les fils de fond sont identiques à des fils de premier plan, sauf que les threads de fond n'empêchent pas un processus de se terminer. Une fois que tous les fils de premier plan appartenant à un processus ont terminé, la langue courante met fin au processus. Tous les fils de fond restants sont arrêtés et ne terminent pas. P> blockQuote>
En règle générale, en .NET, si vous allez créer votre propre thread, ce sera pour un processus de course à long terme. Dans cette situation, vous ne voudrez normalement pas que le fil soit détruit si l'utilisateur ferme votre formulaire principal. Au lieu de cela, vous voudrez avoir une bonne chance de gérer correctement le nettoyage. P>
Si vous souhaitez simplement exécuter un élément de travail rapide dans un fil d'arrière-plan, utilisez le threadpool. Cela sera généralement beaucoup mieux pour tout ce qui n'est pas un élément de travail longuant. P>
ou utilisez la classe des travailleurs de l'arrière-plan.
Backworker utilise le threadpool, de même que le nouveau paradigme de la tâche dans .NET 4, donc je les traitais dans le cadre de l'utilisation de la threadpool.
> Je comprends parfaitement que permettre au fil de se terminer gracieusement est correct et approprié, mais ce qui me manque, c'est que, par défaut, un thread doit accrocher une application complète si elle ne se termine pas avec succès. I> <<< / p> blockQuote>
Sauf si ces fils de fond font quelque chose de très inoffensif, il peut être préférable de suspendre le processus (pendant un peu de temps - jusqu'à ce qu'ils sortent) que de les forcer à arrêter - si vous les faites des fils de fond, vous avez aucun contrôle sur ce qu'ils font lorsqu'ils quittent. Une alternative serait de garder une trace des tâches que vous rencontrez dans des threads "fond". Lorsque votre thread principal veut éteindre, il devrait signaler les fils à annuler et leur donner une chance de sortir gracieusement. S'ils ne parviennent pas à sortir gracieusement, vous pouvez les abandonner (ou les laisser définis comme arrière-plan, mais ne laissez pas votre fil principal de sortir jusqu'à ce que vous soyez prêt à mettre fin aux threads de fond). Il suffit de garder à l'esprit que quelque chose de mauvais pourrait arriver si vous abandonniez un fil - s'il écrivait dans un fichier, le fichier est probablement corrompu, etc. p>
Le concept de premier plan par rapport à l'arrière-plan peut être un peu déroutant. Comme d'autres ont souligné que l'aspect de l'arrière-plan n'affecte que si le temps d'exécution arrêtera le processus ou non. Si aucun filetage de premier plan reste, il fera arrêter le processus quel que soit le nombre de fils d'arrière-plan exécutés une fois le dernier fil de premier plan terminé. P>
comme pour les nouveaux threads en cours d'exécution "en arrière-plan du fil principal" qui n'est pas vraiment le cas. Chaque nouveau thread sera par défaut à la même priorité que vous le fil principal, de sorte qu'ils seront programmés comme fréquemment que le fil principal et que le fil principal ne reçoit donc aucun traitement spécial en ce sens. Les threads sont programmés en fonction de la priorité et non de s'ils se produisent d'être initiés ou des threads de fond. p>
Vous pouvez bien sûr mettre à la fois le fond / le premier plan et la priorité des nouveaux threads, mais la valeur par défaut est que de nouveaux threads sont égaux au thread initial. p>