Zerstören von ThreadsDestroying Threads

Die Abort-Methode wird verwendet, um einen verwalteten Thread dauerhaft zu beenden.The Abort method is used to stop a managed thread permanently. Beim Aufruf von Abort löst die Common Language Runtime eine ThreadAbortException im Zielthread aus, die der Zielthread abfangen kann.When you call Abort, the common language runtime throws a ThreadAbortException in the target thread, which the target thread can catch. Weitere Informationen finden Sie unter Thread.Abort.For more information, see Thread.Abort.

Hinweis

Wenn ein Thread nicht verwalteten Code ausführt, wenn seine Abort-Methode aufgerufen wird, markiert die Runtime ihn mit ThreadState.AbortRequested.If a thread is executing unmanaged code when its Abort method is called, the runtime marks it ThreadState.AbortRequested. Die Ausnahme wird ausgelöst, wenn der Thread zu verwaltetem Code zurückkehrt.The exception is thrown when the thread returns to managed code.

Sobald ein Thread abgebrochen wird, kann er nicht erneut gestartet werden.Once a thread is aborted, it cannot be restarted.

Die Abort-Methode bewirkt keinen sofortigen Abbruch des Threads, da der Zielthread die ThreadAbortException abfangen und beliebige Mengen von Code in einem finally-Block ausführen kann.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. Sie können Thread.Join aufrufen, wenn Sie warten müssen, bis der Thread beendet ist.You can call Thread.Join if you need to wait until the thread has ended. Thread.Join ist ein blockierender Aufruf, von dem keine Rückgabe erfolgt, bis die Ausführung des Threads tatsächlich beendet wurde oder ein optionales Timeoutintervall verstrichen ist.Thread.Join is a blocking call that does not return until the thread has actually stopped executing or an optional timeout interval has elapsed. Der abgebrochene Thread könnte die ResetAbort-Methode aufrufen oder unbegrenzte Verarbeitung in einem finally-Block ausführen – wenn Sie also keinen Timeout angeben, ist nicht garantiert, dass das Warten endet.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.

Threads, die auf einen Aufruf der Thread.Join-Methode warten, können von anderen Threads unterbrochen werden, die Thread.Interrupt aufrufen.Threads that are waiting on a call to the Thread.Join method can be interrupted by other threads that call Thread.Interrupt.

Behandeln von ThreadAbortExceptionHandling ThreadAbortException

Wenn Sie davon ausgehen, dass Ihr Thread entweder als Folge eines Aufrufs von Abort aus Ihrem eigenen Code oder als Ergebnis des Entladens einer Anwendungsdomäne, in der der Thread ausgeführt wird (AppDomain.Unload verwendet Thread.Abort, um Threads zu beenden), abgebrochen wird, muss Ihr Thread die ThreadAbortException behandeln und jegliche endgültige Verarbeitung in einer finally-Klausel ausführen, wie im folgenden Code gezeigt.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.  

Ihr Bereinigungscode muss sich in der catch- oder finally-Klausel befinden, da eine ThreadAbortException erneut am Ende der finally-Klausel bzw. am Ende der catch-Klausel vom System ausgelöst wird, wenn es keine finally-Klausel gibt.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.

Sie können das erneute Auslösen der Ausnahme durch das System mit Aufrufen der Thread.ResetAbort-Methode verhindern.You can prevent the system from rethrowing the exception by calling the Thread.ResetAbort method. Allerdings sollten Sie dies nur tun, wenn Ihr eigener Code die ThreadAbortException verursacht hat.However, you should do this only if your own code caused the ThreadAbortException.

Siehe auchSee Also

ThreadAbortException
Thread
Verwenden von Threads und ThreadingUsing Threads and Threading