C # Thread Termination et Thread.Abort ()

Dans MSDN, la description de la méthode Thread.Abort () indique: “L’appel de cette méthode termine généralement le thread.”

Pourquoi pas toujours?

Dans quels cas il ne termine pas le thread?

Y a-t-il une autre possibilité pour terminer les threads?

Thread.Abort() injecte une ThreadAbortException sur le thread. Le thread peut annuler la demande en appelant Thread.ResetAbort() . En outre, il existe certaines parties de code, telles que finally bloc qui s’exécutera avant que l’exception soit gérée. Si pour une raison quelconque le thread est bloqué dans un tel bloc, l’exception ne sera jamais déclenchée sur le thread.

Comme l’appelant a très peu de contrôle sur l’état du thread lorsqu’il appelle Abort() , il est généralement déconseillé de le faire. Transmettez un message au thread demandant la terminaison à la place.

Dans quels cas il ne termine pas le thread?

Cette question est un doublon.

Quel est le problème avec l’utilisation de Thread.Abort ()

Y a-t-il une autre possibilité de terminer les threads?

Oui. Votre problème est que vous ne devriez jamais démarrer un thread que vous ne pouvez pas poliment arrêter et qu’il s’arrête rapidement. Si vous êtes dans une situation où vous devez lancer un thread qui peut être (1) difficile à arrêter, (2) bogué, ou le 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 terminez le processus lorsque vous voulez que le thread tombe en panne. La seule chose qui peut garantir une terminaison sûre d’un thread non coopératif est le système d’exploitation qui prend tout son processus en charge.

Voir ma réponse trop longue à cette question pour plus de détails:

Utiliser une instruction de locking dans une boucle en C #

Le bit pertinent est le bit à la fin où je discute des considérations relatives à la durée pendant laquelle un thread doit se tuer avant de l’abandonner.