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?
fuente
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?
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.
Esta pregunta es un duplicado.
¿Qué hay de malo en usar Thread.Abort ()?
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.
fuente
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: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.fuente
FileStream.Read()
a una tubería con nombre que actualmente no recibe nada (leer bloques de llamadas mientras espera datos entrantes) no responderáThread.Abort()
. Permanece dentro de laRead()
llamada.fuente
¿Qué pasa si un hilo está bloqueado y se aborta / mata? Los recursos permanecen estancados
referencia MSDN
consulte: Prácticas recomendadas de subprocesos administrados
fuente
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); }});
fuente
ThreadAborts no se producirá dentro de un bloque finalmente o entre BeginCriticalRegion y EndCriticalRegion
fuente
Porque puedes atrapar
ThreadAbortException
y llamarThread.ResetAbort
dentro del controlador.fuente
OT: Para obtener una versión completa, independiente del lenguaje, cuestionablemente útil y muy divertida de la concurrencia, consulte Verity Stob .
fuente
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.
fuente