ThreadAbortException-Klasse

Die Ausnahme, die bei einem Aufruf der Abort-Methode ausgelöst wird. Diese Klasse kann nicht vererbt werden.

Namespace: System.Threading
Assembly: mscorlib (in mscorlib.dll)

Syntax

'Declaration
<SerializableAttribute> _
<ComVisibleAttribute(True)> _
Public NotInheritable Class ThreadAbortException
    Inherits SystemException
'Usage
Dim instance As ThreadAbortException
[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public sealed class ThreadAbortException : SystemException
[SerializableAttribute] 
[ComVisibleAttribute(true)] 
public ref class ThreadAbortException sealed : public SystemException
/** @attribute SerializableAttribute() */ 
/** @attribute ComVisibleAttribute(true) */ 
public final class ThreadAbortException extends SystemException
SerializableAttribute 
ComVisibleAttribute(true) 
public final class ThreadAbortException extends SystemException

Hinweise

Wenn die Abort-Methode für die Zerstörung eines Threads aufgerufen wird, löst die Common Language Runtime eine ThreadAbortException aus. ThreadAbortException ist eine spezielle Ausnahme, die abgefangen werden kann, die aber am Ende des catch-Blocks automatisch wieder ausgelöst wird. Wenn diese Ausnahme ausgelöst wird, führt die Common Language Runtime vor dem Beenden des Threads alle finally-Blöcke aus. Da der Thread in den finally-Blöcken unbegrenzte Berechnungen ausführen oder die Thread.ResetAbort aufrufen kann, um den Abbruch aufzuheben, gibt es keine Garantie, dass der Thread jemals enden wird. Wenn Sie warten möchten, bis der abgebrochene Thread beendet ist, können Sie die Thread.Join-Methode aufrufen. Join ist ein blockierender Aufruf, dessen Rückgabe erst erfolgt, wenn die Ausführung des Threads beendet ist.

Hinweis

Wenn die Common Language Runtime (CLR) alle Hintergrundthreads beendet, nachdem alle Vordergrundthreads in einer verwalteten ausführbaren Datei beendet wurden, verwendet sie nicht System.Threading.Thread.Abort. Daher können Sie nicht mithilfe der ThreadAbortException feststellen, zu welchem Zeitpunkt Hintergrundthreads von der CLR beendet werden.

ThreadAbortException verwendet HRESULT COR_E_THREADABORTED mit dem Wert 0x80131530.

Hinweis

Der Wert der vererbten Data-Eigenschaft ist immer NULL (Nothing in Visual Basic).

Beispiel

Das folgende Beispiel veranschaulicht den Abbruch eines Threads. Der Thread, der die ThreadAbortException empfängt, verwendet die ResetAbort-Methode, um die Abbruchanforderung abzubrechen und die Ausführung fortzusetzen.

Imports System
Imports System.Threading
Imports System.Security.Permissions


Public Class ThreadWork
   Public Shared Sub DoWork()
      Try
         Dim i As Integer
         For i = 0 To 99
            Console.WriteLine("Thread - working.")
            Thread.Sleep(100)
         Next i
      Catch e As ThreadAbortException
         Console.WriteLine("Thread - caught ThreadAbortException - resetting.")
         Console.WriteLine("Exception message: {0}", e.Message)
         Thread.ResetAbort()
      End Try
      Console.WriteLine("Thread - still alive and working.")
      Thread.Sleep(1000)
      Console.WriteLine("Thread - finished working.")
   End Sub 'DoWork
End Class 'ThreadWork


Class ThreadAbortTest
   Public Shared Sub Main()
      Dim myThreadDelegate As New ThreadStart(AddressOf ThreadWork.DoWork)
      Dim myThread As New Thread(myThreadDelegate)
      myThread.Start()
      Thread.Sleep(100)
      Console.WriteLine("Main - aborting my thread.")
      myThread.Abort()
      myThread.Join()
      Console.WriteLine("Main ending.")
   End Sub 'Main
End Class 'ThreadAbortTest
using System;
using System.Threading;
using System.Security.Permissions;

public class ThreadWork {
    public static void DoWork() {
        try {
            for(int i=0; i<100; i++) {
                Console.WriteLine("Thread - working."); 
                Thread.Sleep(100);
            }
        }
        catch(ThreadAbortException e) {
            Console.WriteLine("Thread - caught ThreadAbortException - resetting.");
            Console.WriteLine("Exception message: {0}", e.Message);
            Thread.ResetAbort();
        }
        Console.WriteLine("Thread - still alive and working."); 
        Thread.Sleep(1000);
        Console.WriteLine("Thread - finished working.");
    }
}

class ThreadAbortTest {
    public static void Main() {
        ThreadStart myThreadDelegate = new ThreadStart(ThreadWork.DoWork);
        Thread myThread = new Thread(myThreadDelegate);
        myThread.Start();
        Thread.Sleep(100);
        Console.WriteLine("Main - aborting my thread.");
        myThread.Abort();
        myThread.Join();
        Console.WriteLine("Main ending."); 
    }
}
using namespace System;
using namespace System::Threading;
using namespace System::Security::Permissions;
ref class ThreadWork
{
public:
   static void DoWork()
   {
      try
      {
         for ( int i = 0; i < 100; i++ )
         {
            Console::WriteLine( "Thread - working." );
            Thread::Sleep( 100 );

         }
      }
      catch ( ThreadAbortException^ e ) 
      {
         Console::WriteLine( "Thread - caught ThreadAbortException - resetting." );
         Console::WriteLine( "Exception message: {0}", e->Message );
         Thread::ResetAbort();
      }

      Console::WriteLine( "Thread - still alive and working." );
      Thread::Sleep( 1000 );
      Console::WriteLine( "Thread - finished working." );
   }

};

int main()
{
   ThreadStart^ myThreadDelegate = gcnew ThreadStart( ThreadWork::DoWork );
   Thread^ myThread = gcnew Thread( myThreadDelegate );
   myThread->Start();
   Thread::Sleep( 100 );
   Console::WriteLine( "Main - aborting my thread." );
   myThread->Abort();
   myThread->Join();
   Console::WriteLine( "Main ending." );
}
import System.*;
import System.Threading.*;
import System.Security.Permissions.*;

public class ThreadWork
{
    public static void DoWork()
    {
        try {
            for (int i = 0; i < 100; i++) {
                Console.WriteLine("Thread - working.");
                System.Threading.Thread.Sleep(100);
            }
        }
        catch (ThreadAbortException e) {
            Console.WriteLine("Thread - caught ThreadAbortException"
                + " - resetting.");
            Console.WriteLine("Exception message: {0}", e.get_Message());
            System.Threading.Thread.ResetAbort();
        }
        Console.WriteLine("Thread - still alive and working.");
        System.Threading.Thread.Sleep(1000);
        Console.WriteLine("Thread - finished working.");
    } //DoWork
} //ThreadWork

class ThreadAbortTest
{
    public static void main(String[] args)
    {
        ThreadStart myThreadDelegate = new ThreadStart(ThreadWork.DoWork);
        System.Threading.Thread myThread =
            new System.Threading.Thread(myThreadDelegate);
        myThread.Start();
        System.Threading.Thread.Sleep(100);
        Console.WriteLine("main - aborting my thread.");
        myThread.Abort();
        myThread.Join();
        Console.WriteLine("main ending.");
    } //main
} //ThreadAbortTest

Dieser Code erzeugt die folgende Ausgabe:

 Thread - working.
 Main - aborting my thread.
 Thread - caught ThreadAbortException - resetting.
 Exception message: Thread was being aborted.
 Thread - still alive and working.
 Thread - finished working.
 Main ending.

Vererbungshierarchie

System.Object
   System.Exception
     System.SystemException
      System.Threading.ThreadAbortException

Threadsicherheit

Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Plattformen

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 2.0

Siehe auch

Referenz

ThreadAbortException-Member
System.Threading-Namespace
Thread-Klasse
Thread.Abort

Weitere Ressourcen

Zerstören von Threads