Zerstören von Threads

Mithilfe der Abort-Methode wird ein verwalteter Thread dauerhaft angehalten. Beim Aufruf von Abort löst die Common Language Runtime im Zielthread eine ThreadAbortException aus, die der Zielthread abfangen kann. Weitere Informationen finden Sie unter Thread.Abort.

HinweisHinweis

Wenn ein Thread beim Aufruf seiner Abort-Methode nicht verwalteten Code ausführt, wird er von der Laufzeit als ThreadState.AbortRequested markiert.Die Ausnahme wird ausgelöst, wenn der Thread zum verwalteten Code zurückkehrt.

Sobald ein Thread abgebrochen wurde, kann er nicht mehr gestartet werden.

Die Abort-Methode verursacht nicht den sofortigen Abbruch des Threads, da der Zielthread die ThreadAbortException abfangen kann und Code beliebiger Länge in einem finally-Block ausführen kann. Wenn Sie die Beendigung des Threads abwarten müssen, können Sie Thread.Join aufrufen. Thread.Join ist ein blockierender Aufruf, der erst beendet wird, nachdem die Ausführung des Threads tatsächlich beendet wurde oder ein optionales Timeoutintervall abgelaufen ist. Der abgebrochene Thread könnte die ResetAbort-Methode aufrufen oder ungebundene Verarbeitung in einem finally-Block ausführen. Wenn Sie kein Timeout angeben, ist das Ende des Wartevorgangs nicht garantiert.

Threads, die auf einen Aufruf der Thread.Join-Methode warten, können durch andere Threads unterbrochen werden, die Thread.Interrupt aufrufen.

Behandeln von ThreadAbortException

Wenn Sie den Abbruch eines Threads erwarten, weil entweder Abort aus Ihrem eigenen Code aufgerufen wurde oder eine Anwendungsdomäne entladen wurde, in der der Thread ausgeführt wird (AppDomain.Unload beendet Threads mit Thread.Abort), muss der Thread die ThreadAbortException behandeln und die endgültige Verarbeitung in einer finally-Klausel ausführen, wie im folgenden Code dargestellt.

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.

Der Bereinigungscode muss sich in der catch-Klausel oder der finally-Klausel befinden, da das System am Ende der finally-Klausel oder am Ende der catch-Klausel, wenn keine finally-Klausel vorhanden ist, erneut eine ThreadAbortException auslöst.

Sie können das erneute Auslösen der Ausnahme durch Aufrufen der Thread.ResetAbort-Methode verhindern. Dies ist jedoch nur sinnvoll, wenn die ThreadAbortException von Ihrem eigenen Code verursacht wurde.

Siehe auch

Referenz

ThreadAbortException

Thread

Weitere Ressourcen

Verwenden von Threads und Threading