7
votes

C # Question de création de fil

Lors de la création d'une nouvelle instance System.thread, la valeur par défaut du isbackground 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.

Merci pour les réponses rapides.

Je fournis des fonctionnalités dans le destructeur de mon composant pour permettre au fil de mettre fin à la gracefully. J'utilise un ManualResetEvent et rejoindre .

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.


0 commentaires

5 Réponses :


22
votes

isbackground signifie que le thread est terminé lorsque l'application se termine. C'est un comportement rarement souhaitable, car cela signifie que le thread ne peut pas s'arrêter et nettoyer correctement.

Au lieu de cela, l'application doit signaler le fil pour terminer, attendre jusqu'à ce qu'il l'ait fait, puis fermez correctement.

C'est mon résumé de ce texte de Blurb à partir du Thread.isbackground Article MSDN :

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.


0 commentaires

4
votes

Ces informations de la page MSDN sur Isbackground explique la différence entre fond d'arrière-plan et fils de premier plan.

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.


0 commentaires

2
votes

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.

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.


2 commentaires

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.



0
votes

> 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. <<< / p>

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.


0 commentaires

2
votes

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é.

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.

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.


0 commentaires