Destruction de threads

Mise à jour : novembre 2007

La méthode Abort sert à arrêter définitivement un thread managé. Lorsque vous appelez Abort, le Common Language Runtime lève une exception ThreadAbortException dans le thread cible, que celui-ci peut intercepter. Pour plus d'informations, consultez Thread.Abort.

Remarque :

Si un thread exécute du code non managé lors de l'appel à sa méthode Abort, le runtime le marque comme ThreadState.AbortRequested. L'exception est levée lorsque le thread retourne dans le code managé.

Lorsqu'un thread est abandonné, il ne peut pas être redémarré.

La méthode Abort ne provoque pas l'abandon immédiat du thread car le thread cible peut intercepter l'exception ThreadAbortException et exécuter du code arbitraire dans un bloc finally. Vous pouvez appeler Thread.Join si vous devez attendre la fin de l'exécution du thread. Thread.Join est un appel bloquant qui n'est pas retourné tant que le thread n'a pas terminé de s'exécuter ou qu'un délai d'attente facultatif n'est pas écoulé. Le thread interrompu pourrait appeler la méthode ResetAbort ou exécuter un traitement illimité dans un bloc finally ; dès lors, si vous ne spécifiez pas de délai d'expiration, rien ne garantit que l'attente se termine.

Les threads qui attendent un appel à la méthode Thread.Join peuvent être interrompus par d'autres threads qui appellent Thread.Interrupt.

Gestion de ThreadAbortException

Si vous pensez que votre thread sera interrompu, soit en conséquence de l'appel à Abort à partir de votre code utilisateur, soit en raison du déchargement d'un domaine d'application dans lequel le thread s'exécute (AppDomain.Unload utilise Thread.Abort pour arrêter des threads), votre thread doit gérer l'exception ThreadAbortException et exécuter la fin éventuelle du traitement dans une clause finally, comme illustré dans le code suivant.

Try
    ' Code that is executing when the thread is aborted.
Catch ex As ThreadAbortException
    ' Clean-up code can go here.
    ' If there is no Finally clause, ThreadAbortException is
    ' re-thrown by the system at the end of the Catch clause. 
Finally
    ' Clean-up code can go here.
End Try
' Do not put clean-up code here, because the exception 
' is rethrown at the end of the Finally clause.
try 
{
    // Code that is executing when the thread is aborted.
} 
catch (ThreadAbortException ex) 
{
    // Clean-up code can go here.
    // If there is no Finally clause, ThreadAbortException is
    // re-thrown by the system at the end of the Catch clause. 
}
// Do not put clean-up code here, because the exception 
// is rethrown at the end of the Finally clause.

Votre code de nettoyage doit figurer dans la clause catch ou la clause finally, dans la mesure où le système lève de nouveau ThreadAbortException à la fin de la clause finally ou à la fin de la clause catch en l'absence d'une clause finally.

Vous pouvez empêcher le système de lever une nouvelle fois l'exception en appelant la méthode Thread.ResetAbort. Toutefois, ne le faites que dans le seul cas où votre code utilisateur a provoqué ThreadAbortException.

Voir aussi

Référence

ThreadAbortException

Thread

Autres ressources

Utilisation des threads et du threading