C# fin des Threads et du Fil.Abort()
Dans MSDN, la description de la Thread.Méthode Abort() dit: "l'Appel de cette méthode généralement s'arrête le thread."
Pourquoi pas TOUJOURS?
Dans quels cas il n'est pas arrêter le fil?
Il y a aucune autre possibilité de résilier les threads?
Vous devez vous connecter pour publier un commentaire.
Thread.Abort()
injecte uneThreadAbortException
sur le fil. Le fil peut annuler la demande en appelantThread.ResetAbort()
. Aussi, il y a certaines parties du code, commefinally
bloc à exécuter avant que l'exception est gérée. Si, pour une raison quelconque, le fil est coincé dans un bloc de l'exception ne seront jamais posées sur le fil.Que l'appelant a très peu de contrôle sur l'état du thread lors de l'appel de
Abort()
, il est généralement conseillé de ne pas le faire. Passer un message dans le thread de demander la résiliation à la place.Cette question est un doublon.
Quel est le problème avec l'aide de Fil.Abort()
Oui. Votre problème est que vous ne devriez jamais commencer un thread que vous ne pouvez pas dire poliment d'arrêter, et il s'arrête en un temps opportun. Si vous êtes dans une situation où vous avez besoin de lancer un thread qui pourrait être (1) difficile de s'arrêter, (2) buggy, ou pire de tous (3) hostile à l'utilisateur, alors la meilleure chose à faire est de faire un nouveau processus, démarrer le thread dans le nouveau processus, puis terminer le processus lorsque vous souhaitez que le thread pour aller vers le bas. La seule chose qui peut garantir la sécurité de la terminaison d'un thread non coopératif est le système d'exploitation prenant en bas de tout le processus.
Voir mon trop long de répondre à cette question pour plus de détails:
Utilisez la fonction de verrouillage de la déclaration dans une boucle en C#
Pertinentes bit est le bit à la fin où j'ai discuter de ce que les considérations relatives à combien de temps vous devez attendre pour un thread à tuer lui-même avant de l'abandonner.
Pour commencer, un thread peut attraper un
ThreadAbortException
et annuler sa propre terminaison. Ou il pourrait effectuer un calcul qui prend une éternité alors que vous êtes en train de l'abandonner. De ce fait, le moteur d'exécution ne peut pas garantir que le fil sera toujours terminer une fois que vous lui demandez.ThreadAbortException
a plus:Vous n'avez pas besoin de
Abort()
un fil manuellement. Le CLR va faire tout le sale boulot pour vous si vous laissez la méthode dans le fil de retour; qui mettra fin à la thread normalement.FileStream.Read()
à un canal nommé qui n'est actuellement pas recevoir quoi que ce soit (lire l'appel des blocs lors de l'attente pour l'entrée de données) ne permettra pas de répondre àThread.Abort()
. Il reste à l'intérieur de laRead()
appel.Que si un thread est un verrou et est annulée /tué ? Ressources de rester coincé
référence MSDN
voir: Géré Filetage Meilleures Pratiques
ThreadAborts ne va pas se produire à l'intérieur d'un bloc finally ou entre BeginCriticalRegion et EndCriticalRegion
Je n'arrive pas à interrompre un thread qui est coincé dans une boucle:
Je peux toutefois interrompre le thread si dort pendant la boucle:
Parce que vous pouvez attraper le
ThreadAbortException
et appelThread.ResetAbort
à l'intérieur du gestionnaire.OT: Pour une approche globale, indépendant de la langue, particulièrement utile et sacrément drôle de prendre sur la concurrence, voir Verity Stob!
J'ai eu des cas où le fil a été trop occupé pour entendre la Abort() appel, ce qui entraîne généralement une ThreadAbortingException d'être jeté à mon code.