C # Terminación del hilo y Thread.Abort ()

En MSDN, la descripción del método Thread.Abort () dice: “Llamar a este método generalmente termina el hilo”.

¿Por qué no SIEMPRE?

¿En qué casos no termina el hilo?

¿Hay alguna otra posibilidad de terminar subprocesos?

Thread.Abort() inyecta una ThreadAbortException en el hilo. El hilo puede cancelar la solicitud llamando a Thread.ResetAbort() . Además, hay ciertas partes del código, como finally bloque que se ejecutará antes de que se maneje la excepción. Si por algún motivo el hilo queda atascado en dicho bloque, la excepción nunca se levantará en el hilo.

Como la persona que llama tiene muy poco control sobre el estado del hilo al llamar a Abort() , generalmente no es aconsejable hacerlo. Pase un mensaje al hilo que solicita la terminación en su lugar.

¿En qué casos no termina el hilo?

Esta pregunta es un duplicado

Qué pasa con el uso de Thread.Abort ()

¿Hay alguna otra posibilidad para terminar los hilos?

Sí. Tu problema es que nunca debes poner en marcha un hilo que no puedes decir educadamente que pare, y se detiene de manera oportuna. Si se encuentra en una situación en la que tiene que iniciar un hilo que puede ser (1) difícil de detener, (2) defectuoso, o lo peor de todo (3) hostil para el usuario, entonces lo correcto es hacer un nuevo proceso, inicie el hilo en el nuevo proceso y luego finalice el proceso cuando desee que el hilo baje. Lo único que puede garantizar la finalización segura de un hilo no cooperativo es que el sistema operativo anule todo el proceso.

Vea mi respuesta excesivamente larga a esta pregunta para más detalles:

Usar instrucción de locking 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 para que un hilo se mate antes de abortarlo.

¿Por qué no SIEMPRE? ¿En qué casos no termena el hilo?

Para empezar, un hilo puede atrapar una ThreadAbortException y cancelar su propia terminación. O podría realizar un cálculo que demora para siempre mientras intentas abortarlo. Debido a esto, el tiempo de ejecución no puede garantizar que el hilo siempre terminará después de que se lo solicite.

ThreadAbortException tiene más:

Cuando se realiza una llamada al método Abortar para destruir un hilo, el tiempo de ejecución común del lenguaje arroja una ThreadAbortException. ThreadAbortException es una excepción especial que se puede capturar, pero se levantará automáticamente de nuevo al final del bloque catch. Cuando se produce esta excepción, el tiempo de ejecución ejecuta todos los bloques finally antes de finalizar el hilo. Como el hilo puede hacer un cálculo ilimitado en los bloques finally, o llamar a Thread.ResetAbort() para cancelar el aborto, no hay garantía de que el hilo termine alguna vez.

No es necesario Abort() un hilo manualmente. El CLR hará todo el trabajo sucio por ti si simplemente dejas que el método en el hilo vuelva; eso terminará el hilo normalmente

FileStream.Read() a un conducto con nombre que actualmente no recibe nada (leer bloques de llamadas mientras espera los datos entrantes) no responderá a Thread.Abort() . Permanece dentro de la llamada de Read() .

¿Qué pasa si un hilo está sosteniendo un candado y se cancela / mata? Los recursos permanecen estancados

Funciona bien cuando un hilo llama aborta pero no por otro hilo. Abort, termina por la fuerza el hilo afectado incluso si no ha completado su tarea y no brinda ninguna oportunidad para la limpieza de los recursos

referencia MSDN


ver: Mejores prácticas administradas de Threading

ThreadAborts no ocurrirá dentro de un bloque finally o entre BeginCriticalRegion y EndCriticalRegion

Porque puede atrapar la ThreadAbortException y llamar a Thread.ResetAbort dentro del controlador.

Parece que no puedo abortar un hilo que está atorado 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); }}); 

OT: ¡Para obtener una visión general de la concurrencia, agnóstica, cuestionablemente útil y malditamente divertida, vea Verity Stob !

He tenido casos en los que el hilo ha estado demasiado ocupado para escuchar la llamada Abort (), que generalmente da como resultado que se genere una ThreadAbortingException en mi código.