Excepción que se produce cuando se realiza una llamada al método
Abort. No se puede heredar esta clase.
Espacio de nombres: System.Threading
Ensamblado: mscorlib (en mscorlib.dll)

Sintaxis
Visual Basic (Declaración)
<SerializableAttribute> _
<ComVisibleAttribute(True)> _
Public NotInheritable Class ThreadAbortException
Inherits SystemException
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

Comentarios
Cuando se hace una llamada al método Abort para destruir un subproceso, Common Language Runtime produce una ThreadAbortException. ThreadAbortException es una excepción especial que se puede detectar, pero se volverá a producir automáticamente al final del bloque catch. Cuando se produce esta excepción, el motor en tiempo de ejecución ejecuta todos los bloques finally antes de finalizar el subproceso. Como el subproceso puede hacer un cálculo ilimitado en los bloques finally o puede llamar a Thread.ResetAbort para cancelar la anulación, no hay ninguna garantía de que el subproceso finalice en algún momento. Si desea esperar a que el subproceso anulado finalice, puede llamar al método Thread.Join. Join es una llamada de bloqueo que no regresa hasta que el subproceso deja de ejecutarse realmente.
Nota: |
|---|
| Cuando Common Language Runtime (CLR) detiene los subprocesos en segundo plano (una vez que han finalizado todos los subprocesos en primer plano de un archivo ejecutable administrado), no utiliza System.Threading.Thread.Abort. Por lo tanto, no se puede utilizar ThreadAbortException para detectar el momento en el que CLR finaliza los subprocesos en segundo plano. |
ThreadAbortException utiliza el resultado HRESULT COR_E_THREADABORTED, que tiene el valor 0x80131530.
Nota: |
|---|
| El valor de la propiedad heredad Data es siempre referencia null (Nothing en Visual Basic). |

Ejemplo
En el siguiente ejemplo se muestra la forma de anular un subproceso. El subproceso que recibe ThreadAbortException utiliza el método ResetAbort para cancelar la solicitud de anulación y reanudar la ejecución.
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
Este código genera el siguiente resultado:
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.

Jerarquía de herencia

Seguridad para subprocesos
Los miembros estáticos públicos (
Shared en Visual Basic) de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.

Plataformas
Windows 98, Windows 2000 Service Pack 4, Windows CE, Windows Millennium, Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter
Microsoft .NET Framework 3.0 es compatible con Windows Vista, Microsoft Windows XP SP2 y Windows Server 2003 SP1.

Información de versión
.NET Framework
Compatible con: 3.0, 2.0, 1.1, 1.0
.NET Compact Framework
Compatible con: 2.0
XNA Framework
Compatible con: 1.0

Vea también