Destruir subprocesos

El método Abort se utiliza para detener un subproceso administrado de forma permanente. Cuando llama a Abort, Common Language Runtime inicia una ThreadAbortException en el subproceso de destino, que puede detectar el subproceso de destino. Para obtener más información, vea Thread.Abort.

NotaNota

Si un subproceso está ejecutando código no administrado cuando se llama a su método Abort, el motor en tiempo de ejecución lo marca como ThreadState.AbortRequested.Se inicia la excepción cuando el subproceso vuelve al código administrado.

Una vez anulado un subproceso, no se puede reiniciar.

El método Abort no causa que el subproceso se anule inmediatamente, porque el subproceso de destino puede detectar la ThreadAbortException y ejecutar cantidades arbitrarias de código en un bloque finally. Puede llamar a Thread.Join si necesita esperar hasta que haya finalizado el subproceso. Thread.Join es una llamada de bloqueo que no vuelve hasta que la ejecución del subproceso se ha detenido realmente o ha transcurrido un tiempo de espera opcional. El subproceso anulado podría llamar al método ResetAbort o realizar un procesamiento independiente en un bloque finally, por lo que si no especifica un tiempo de espera, no existe garantía de que finalice dicha espera.

Otros subprocesos que llaman a Thread.Interruptpueden interrumpir subprocesos que están esperando una llamada al método Thread.Join.

Controlar ThreadAbortException

Si espera que se vaya a anular su subproceso, bien como resultado de llamar a Abort desde su propio código o como resultado de descargar un dominio de aplicación en el que se está ejecutando el subproceso (AppDomain.Unload utiliza Thread.Abort para finalizar subprocesos), su subproceso debe controlar la ThreadAbortException y realizar cualquier procesamiento final en una cláusula finally, como se puede ver en el código siguiente.

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.

Su código de limpieza debe estar en la cláusula catch o en la cláusula finally, porque el sistema vuelve a iniciar una ThreadAbortException al final de la cláusula finally, o al final de la cláusula catch si no hay ninguna cláusula finally.

Puede evitar el sistema de vuelva a iniciar la excepción llamando al método Thread.ResetAbort. Sin embargo, sólo debería hacerlo si la ThreadAbortException fue provocada por su propio código.

Vea también

Referencia

ThreadAbortException

Thread

Otros recursos

Utilizar subprocesos y subprocesamiento