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