Exportar (0) Imprimir
Expandir todo

ThreadAbortException (Clase)

Actualización: noviembre 2007

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)

[SerializableAttribute]
[ComVisibleAttribute(true)]
public sealed class ThreadAbortException : SystemException
/** @attribute SerializableAttribute */ 
/** @attribute ComVisibleAttribute(true) */
public final class ThreadAbortException extends SystemException
public final class ThreadAbortException extends SystemException

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.

he1x3cf1.alert_note(es-es,VS.90).gifNota:

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 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.

he1x3cf1.alert_note(es-es,VS.90).gifNota:

El valor de la propiedad heredad Data es siempre null.

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.

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."); 
    }
}


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.

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

Todos los miembros static (Shared en Visual Basic) públicos 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.

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile para Smartphone, Windows Mobile para Pocket PC, Xbox 360

.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

.NET Framework

Compatible con: 3.5, 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Compatible con: 3.5, 2.0

XNA Framework

Compatible con: 2.0, 1.0

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft