Détruire des threadsDestroying threads

La méthode Thread.Abort permet d’arrêter définitivement un thread managé.The Thread.Abort method is used to stop a managed thread permanently. Quand vous appelez Abort, le Common Language Runtime lève une exception ThreadAbortException dans le thread cible, que ce dernier peut intercepter.When you call Abort, the common language runtime throws a ThreadAbortException in the target thread, which the target thread can catch. Pour plus d'informations, consultez Thread.Abort.For more information, see Thread.Abort.

Notes

Si un thread est en train d’exécuter du code non managé quand sa méthode Abort est appelée, le runtime le marque comme ThreadState.AbortRequested.If a thread is executing unmanaged code when its Abort method is called, the runtime marks it ThreadState.AbortRequested. L’exception est levée quand le thread retourne au code managé.The exception is thrown when the thread returns to managed code.

Une fois un thread annulé, il ne peut pas être redémarré.Once a thread is aborted, it cannot be restarted.

La méthode Abort n’entraîne pas l’annulation immédiate du thread, car le thread cible peut intercepter l’exception ThreadAbortException et exécuter arbitrairement des quantités de code dans un bloc finally.The Abort method does not cause the thread to abort immediately, because the target thread can catch the ThreadAbortException and execute arbitrary amounts of code in a finally block. Vous pouvez appeler Thread.Join si vous devez attendre que le thread se termine.You can call Thread.Join if you need to wait until the thread has ended. Thread.Join est un appel bloquant qui ne retourne de résultats que quand le thread a réellement arrêté son exécution ou qu’un intervalle de délai d’attente facultatif a expiré.Thread.Join is a blocking call that does not return until the thread has actually stopped executing or an optional timeout interval has elapsed. Le thread annulé pourrait appeler la méthode ResetAbort ou exécuter un traitement illimité dans un bloc finally. Par conséquent, si vous ne spécifiez pas de délai d’attente, l’attente pourrait ne jamais se terminer.The aborted thread could call the ResetAbort method or perform unbounded processing in a finally block, so if you do not specify a timeout, the wait is not guaranteed to end.

Les threads qui attendent suite à un appel à la méthode Thread.Join peuvent être interrompus par d’autres threads qui appellent Thread.Interrupt.Threads that are waiting on a call to the Thread.Join method can be interrupted by other threads that call Thread.Interrupt.

Gestion de ThreadAbortExceptionHandling ThreadAbortException

Si vous pensez que votre thread sera annulé, soit suite à un appel de votre propre code à Abort, soit suite au déchargement d’un domaine d’application dans lequel le thread est en cours d’exécution (AppDomain.Unload utilise Thread.Abort pour arrêter des threads), votre thread doit gérer l’exception ThreadAbortException et exécuter tout traitement final dans une clause finally, comme indiqué dans le code suivant.If you expect your thread to be aborted, either as a result of calling Abort from your own code or as a result of unloading an application domain in which the thread is running (AppDomain.Unload uses Thread.Abort to terminate threads), your thread must handle the ThreadAbortException and perform any final processing in a finally clause, as shown in the following code.

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 la clause catch ou la clause finally, car une exception ThreadAbortException est de nouveau levée par le système à la fin de la clause finally, ou à la fin de la clause catch s’il n’existe pas de clause finally.Your clean-up code must be in the catch clause or the finally clause, because a ThreadAbortException is rethrown by the system at the end of the finally clause, or at the end of the catch clause if there is no finally clause.

Vous pouvez empêcher le système de lever une nouvelle exception en appelant la méthode Thread.ResetAbort.You can prevent the system from rethrowing the exception by calling the Thread.ResetAbort method. Vous ne devez néanmoins le faire que si c’est votre propre code qui a provoqué l’exception ThreadAbortException.However, you should do this only if your own code caused the ThreadAbortException.

Voir aussiSee also