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