Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Um die Ausführung des Threads zu beenden, verwenden Sie in der Regel das kooperative Abbruchmodell. Manchmal ist es jedoch nicht möglich, einen Thread kooperativ zu beenden, da er Drittanbietercode ausführt, der nicht für die kooperative Abbruchfunktion konzipiert ist. In .NET Framework-Apps können Sie die Thread.Abort-Methode verwenden, um einen verwalteten Thread zwangsweise zu beenden. Wenn Sie Abort aufrufen, löst die Common Language Runtime ein ThreadAbortException im Zielthread aus, den der Zielthread abfangen kann. (Die .NET Framework-Runtime wirft jedoch die Ausnahme nach dem Block catch immer automatisch erneut aus.) Weitere Informationen finden Sie unter Thread.Abort.
Die Thread.Abort Methode wirft zur Laufzeit eine PlatformNotSupportedException in .NET Core und .NET 5 und höher. Ab .NET 5 ist sie auch als veraltet (SYSLIB0006) gekennzeichnet, sodass durch aufrufen eine Kompilierungszeitwarnung generiert wird. Wenn Sie die Ausführung von Drittanbietercode in modernen .NET-Implementierungen zwangsweise beenden müssen, führen Sie ihn in einem separaten Prozess aus und verwenden Sie Process.Kill.
Hinweis
- Wenn Sie Thread.Abort aufrufen, um einen anderen Thread als den aktuellen abzubrechen, wissen Sie nicht, welcher Code ausgeführt oder nicht ausgeführt wurde, wenn ThreadAbortException ausgelöst wird. Sie können auch nicht sicher sein, in welchem Zustand sich Ihre Anwendung oder irgendein Anwendungs- und Benutzerzustand befindet, für dessen Erhaltung sie verantwortlich ist. Beispielsweise kann das Aufrufen Thread.Abort die Ausführung statischer Konstruktoren oder die Veröffentlichung von verwalteten oder nicht verwalteten Ressourcen verhindern.
- Wenn ein Thread beim Aufrufen der Abort Methode nicht verwalteten Code ausführt, markiert die Laufzeit ihn ThreadState.AbortRequested. Die Ausnahme wird ausgelöst, wenn der Thread zu verwaltetem Code zurückkehrt.
Sobald ein Thread abgebrochen wurde, kann er nicht neu gestartet werden.
Die Abort Methode führt nicht dazu, dass der Thread sofort abgebrochen wird, da der Zielthread die ThreadAbortException abfangen und beliebige Codemengen in einem finally-Block ausführen kann. Sie können Thread.Join aufrufen, wenn Sie warten müssen, bis der Thread beendet wurde.
Thread.Join ist ein blockierender Aufruf, der erst zurückkehrt, wenn der Thread tatsächlich aufgehört hat zu laufen, oder ein optionales Timeout-Intervall abgelaufen ist. Der abgebrochene Thread kann die ResetAbort Methode aufrufen oder eine ungebundene Verarbeitung in einem finally Block ausführen. Wenn Sie also kein Timeout angeben, ist das Beenden der Wartezeit nicht garantiert.
Threads, die auf einen Aufruf der Thread.Join-Methode warten, können von anderen Threads unterbrochen werden, die Thread.Interrupt aufrufen.
Behandeln von ThreadAbortException
Wenn Sie erwarten, dass Ihr Thread abgebrochen wird, entweder als Ergebnis des Aufrufs Abort von Ihrem eigenen Code oder als Ergebnis des Entladens einer Anwendungsdomäne, in der der Thread ausgeführt wird (AppDomain.Unload verwendet Thread.Abort zum Beenden von Threads), muss Ihr Thread die ThreadAbortException endgültige Verarbeitung in einer finally Klausel verarbeiten und 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.
Ihr Bereinigungscode muss sich in der catch-Klausel oder der finally-Klausel befinden, da ein ThreadAbortException am Ende der finally-Klausel oder, wenn keine finally-Klausel vorhanden ist, am Ende der catch-Klausel vom System erneut ausgelöst wird.
Sie können verhindern, dass das System die Ausnahme erneut auslöst, indem Sie die Thread.ResetAbort Methode aufrufen. Dies sollten Sie jedoch nur tun, wenn Ihr eigener Code dies ThreadAbortExceptionverursacht hat.