Thread.Abort()
injecte un ThreadAbortException
sur le fil. Le thread peut annuler la demande en appelant Thread.ResetAbort()
. En outre, certaines parties de code, telles qu'un finally
bloc, s'exécutent avant que l'exception ne soit gérée. Si pour une raison quelconque le thread est bloqué dans un tel bloc, l'exception ne sera jamais levée sur le thread.
Comme l'appelant a très peu de contrôle sur l'état du thread lors de l'appel Abort()
, il n'est généralement pas conseillé de le faire. Passez plutôt un message au thread demandant l'arrêt.
Cette question est un double.
Quel est le problème avec l'utilisation de Thread.Abort ()
Oui. Votre problème est que vous ne devriez jamais démarrer un thread auquel vous ne pouvez pas dire poliment d'arrêter, et il s'arrête en temps opportun. Si vous êtes dans une situation où vous devez démarrer un thread qui pourrait être (1) difficile à arrêter, (2) bogué, ou pire de tous (3) hostile à l'utilisateur, alors la bonne chose à faire est de faire un nouveau processus, démarrez le thread dans le nouveau processus, puis arrêtez le processus lorsque vous souhaitez que le thread s'arrête. La seule chose qui peut garantir l'arrêt en toute sécurité d'un thread non coopératif est que le système d'exploitation supprime tout son processus.
Voir ma réponse excessivement longue à cette question pour plus de détails:
Utilisation de l'instruction de verrouillage dans une boucle en C #
Le bit pertinent est le bit à la fin où je discute de ce que sont les considérations concernant combien de temps vous devez attendre qu'un thread se tue avant de l'abandonner.
la source
Pour commencer, un thread peut intercepter un
ThreadAbortException
et annuler sa propre terminaison. Ou il pourrait effectuer un calcul qui prend une éternité pendant que vous essayez de l'abandonner. Pour cette raison, le runtime ne peut pas garantir que le thread se terminera toujours une fois que vous le lui aurez demandé.ThreadAbortException
a plus:Vous n'avez pas besoin d'
Abort()
un thread manuellement. Le CLR fera tout le sale boulot pour vous si vous laissez simplement la méthode dans le thread retourner; cela mettra fin au fil normalement.la source
FileStream.Read()
vers un tube nommé qui ne reçoit actuellement rien (lire les blocs d'appels en attendant les données entrantes) ne répondra pasThread.Abort()
. Il reste à l'intérieur de l'Read()
appel.la source
Que faire si un thread détient un verrou et est abandonné / tué? Les ressources restent bloquées
référence MSDN
voir: Meilleures pratiques de gestion de threads
la source
Je n'arrive pas à interrompre un thread qui est coincé dans une boucle:
//immortal Thread th1 = new Thread(() => { while (true) {}});
Je peux cependant abandonner le thread s'il dort pendant la boucle:
//mortal Thread th2 = new Thread(() => { while (true) { Thread.Sleep(1000); }});
la source
ThreadAborts ne se produira pas dans un bloc finally ou entre BeginCriticalRegion et EndCriticalRegion
la source
Parce que vous pouvez attraper
ThreadAbortException
et appelerThread.ResetAbort
à l'intérieur du gestionnaire.la source
OT: Pour une interprétation complète, indépendante de la langue, discutablement utile et vraiment amusante sur la concurrence, voir Verity Stob !
la source
J'ai eu des cas où le thread était trop occupé pour entendre l'appel Abort (), ce qui se traduit généralement par une ThreadAbortingException renvoyée à mon code.
la source