Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Pour mettre fin à l’exécution du thread, vous utilisez généralement le modèle d’annulation coopérative. Toutefois, il n’est parfois pas possible d’arrêter un thread de manière coopérative, car il exécute du code tiers non conçu pour l’annulation coopérative. Dans les applications .NET Framework, vous pouvez utiliser la Thread.Abort méthode pour mettre fin à un thread managé de force. Lorsque vous appelez Abort, le Common Language Runtime lance un ThreadAbortException dans le thread cible, que le thread cible peut attraper. (Toutefois, le runtime .NET Framework relance toujours automatiquement l’exception après le bloc catch.) Pour plus d'informations, consultez Thread.Abort.
La Thread.Abort méthode lève un PlatformNotSupportedException au moment de l’exécution dans .NET Core et .NET 5 et versions ultérieures. À compter de .NET 5, il est également marqué comme obsolète (SYSLIB0006), de sorte qu’il génère un avertissement au moment de la compilation. Si vous devez mettre fin à l’exécution du code tiers de force dans les implémentations .NET modernes, exécutez-le dans le processus distinct et utilisez Process.Kill.
Note
- Lorsque vous appelez Thread.Abort pour abandonner un thread autre que le thread actuel, vous ne savez pas quel code a exécuté ou n’a pas pu s’exécuter lors de la levée du ThreadAbortException thread. Vous ne pouvez pas non plus être certain de l’état de votre application ni de l’état de toute application et de l’utilisateur qu’elle doit préserver. Par exemple, l’appel Thread.Abort peut empêcher l’exécution de constructeurs statiques ou la libération des ressources gérées ou non gérées.
- Si un thread exécute du code non managé quand sa Abort méthode est appelée, l'environnement d'exécution le marqueThreadState.AbortRequested. L’exception est levée lorsque le thread retourne au code managé.
Une fois qu’un thread est abandonné, il ne peut pas être redémarré.
La méthode Abort n’entraîne pas l’arrêt immédiat du thread, car le thread cible peut intercepter ThreadAbortException et exécuter des segments de code arbitraires dans un bloc finally. Vous pouvez appeler Thread.Join si vous devez attendre la fin du thread.
Thread.Join est un appel bloquant qui ne retourne pas tant que le thread n’a pas réellement cessé d’exécuter ou qu’un intervalle de délai d’attente facultatif s’est écoulé. Le thread abandonné peut appeler la ResetAbort méthode ou effectuer un traitement non lié dans un finally bloc. Par conséquent, si vous ne spécifiez pas de délai d’attente, l’attente n’est pas garantie de se terminer.
Les threads qui attendent un appel à la Thread.Join méthode peuvent être interrompus par d’autres threads qui appellent Thread.Interrupt.
Gestion de ThreadAbortException
Si vous vous attendez à ce que votre thread soit abandonné, soit en raison de l’appel Abort à partir de votre propre code, soit du déchargement d’un domaine d’application dans lequel le thread s’exécute (AppDomain.Unload utilise Thread.Abort pour arrêter les threads), votre thread doit gérer le ThreadAbortException et effectuer tout traitement final 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 se trouver dans le catch bloc ou le finally bloc, car un ThreadAbortException est relancée par le système à la fin du finally bloc, ou à la fin du catch bloc s’il n’y a pas de finally bloc.
Vous pouvez empêcher le système de relancer l’exception en appelant la Thread.ResetAbort méthode. Toutefois, vous devez effectuer cette opération uniquement si votre propre code a provoqué le ThreadAbortException.