En MSDN, la descripción del método Thread.Abort () dice: "Llamar a este método normalmente termina el hilo".
¿Por qué no SIEMPRE?
¿En qué casos no termina el hilo?
¿Existe alguna otra posibilidad de terminar los hilos?
En MSDN, la descripción del método Thread.Abort () dice: "Llamar a este método normalmente termina el hilo".
¿Por qué no SIEMPRE?
¿En qué casos no termina el hilo?
¿Existe alguna otra posibilidad de terminar los hilos?
Respuestas:
Thread.Abort()
inyecta un ThreadAbortException
en el hilo. El hilo puede cancelar la solicitud llamando Thread.ResetAbort()
. Además, hay ciertas partes del código, como el finally
bloque, que se ejecutará antes de que se maneje la excepción. Si por alguna razón el hilo se atasca en dicho bloque, la excepción nunca se generará en el hilo.
Como la persona que llama tiene muy poco control sobre el estado del hilo al llamar Abort()
, generalmente no es aconsejable hacerlo. En su lugar, pasa un mensaje al hilo solicitando la terminación.
¿En qué casos no termina el hilo?
Esta pregunta es un duplicado.
¿Qué hay de malo en usar Thread.Abort ()?
¿Existe alguna otra posibilidad para terminar los hilos?
Si. Su problema es que nunca debe iniciar un hilo al que no pueda decirle cortésmente que se detenga, y se detiene de manera oportuna. Si se encuentra en una situación en la que tiene que iniciar un hilo que podría ser (1) difícil de detener, (2) con errores, o lo peor de todo (3) hostil al usuario, entonces lo correcto es hacer un nuevo proceso, inicie el subproceso en el nuevo proceso y luego finalice el proceso cuando desee que el subproceso baje. Lo único que puede garantizar la terminación segura de un hilo que no coopera es que el sistema operativo elimine todo su proceso.
Vea mi respuesta excesivamente larga a esta pregunta para obtener más detalles:
Uso de la declaración de bloqueo dentro de un bucle en C #
El bit relevante es el bit al final donde discuto cuáles son las consideraciones con respecto a cuánto tiempo debe esperar a que un hilo se mate antes de abortarlo.
¿Por qué no SIEMPRE? ¿En qué casos no termina el hilo?
Para empezar, un hilo puede atrapar ThreadAbortException
ay cancelar su propia terminación. O podría realizar un cálculo que lleva una eternidad mientras intentas abortarlo. Debido a esto, el tiempo de ejecución no puede garantizar que el hilo siempre terminará después de que usted lo solicite.
ThreadAbortException
tiene mas:
Cuando se realiza una llamada al método Abort para destruir un hilo, Common Language Runtime lanza una ThreadAbortException. ThreadAbortException es una excepción especial que se puede capturar, pero se generará de nuevo automáticamente al final del bloque de captura. Cuando se genera esta excepción, el tiempo de ejecución ejecuta todos los bloques finalmente antes de finalizar el hilo. Dado que el hilo puede hacer un cálculo ilimitado en los bloques finalmente, o llamar
Thread.ResetAbort()
para cancelar el aborto, no hay garantía de que el hilo termine alguna vez.
No necesitas Abort()
un hilo manualmente. El CLR hará todo el trabajo sucio por usted si simplemente deja que el método en el hilo regrese; que terminará el hilo normalmente.
¿Qué pasa si un hilo está bloqueado y se aborta / mata? Los recursos permanecen estancados
Funciona bien cuando un hilo llama a abortarse pero no por otro hilo. Abortar, termina forzosamente el subproceso afectado incluso si no ha completado su tarea y no brinda ninguna oportunidad para la limpieza de recursos
referencia MSDN
consulte: Prácticas recomendadas de subprocesos administrados
Parece que no puedo abortar un hilo que está atascado en un bucle:
//immortal
Thread th1 = new Thread(() => { while (true) {}});
Sin embargo, puedo abortar el hilo si duerme durante el ciclo:
//mortal
Thread th2 = new Thread(() => { while (true) { Thread.Sleep(1000); }});
ThreadAborts no se producirá dentro de un bloque finalmente o entre BeginCriticalRegion y EndCriticalRegion
Porque puedes atrapar ThreadAbortException
y llamar Thread.ResetAbort
dentro del controlador.
OT: Para obtener una versión completa, independiente del lenguaje, cuestionablemente útil y muy divertida de la concurrencia, consulte Verity Stob .
He tenido casos en los que el hilo ha estado demasiado ocupado para escuchar la llamada Abort (), lo que generalmente da como resultado que se lanza una ThreadAbortingException a mi código.