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

Entonces sé que no deberías usar

Thread.Abort() 

Pero nunca me han dado una buena explicación. ¿Hay una penalización de rendimiento o algo de dinero oculto?

Sé que no puedes ignorar / tragar la ThreadAbortException (lo cual tiene sentido)

Además de todas las otras buenas respuestas aquí, permítanme agregar que no hay garantía alguna de que una llamada a Thread.Abort realmente abortará el hilo en cuestión, nunca. Es posible (aunque no particularmente fácil) “endurecer” un hilo contra el aborto. Si, por ejemplo, está abortando un hilo porque cree que está ejecutando un código hostil, entonces el código hostil podría resistir su propia destrucción.

Si tiene una operación de larga ejecución que involucra un código que no le pertenece y que debe eliminarse limpiamente, la forma correcta de hacerlo es poner ese código en su propio proceso , no en su propio hilo. (Y preferiblemente en un dominio de aplicación altamente restringido de seguridad en ese proceso). Luego puede eliminar el proceso limpiamente.

En resumen, Thread.Abort es, en el mejor de los casos, indicativo de un diseño incorrecto, posiblemente poco confiable y extremadamente peligroso. Debe evitarse a toda costa; el único momento en el que deberías considerar abortar un hilo es mediante un código de “apagado de emergencia” en el que intentas derribar un dominio de aplicación lo más limpiamente posible.

Porque si sabes que el hilo está en un estado seguro en el que se puede abortar, seguramente puedes organizar una mejor comunicación y hacer que el hilo salga limpiamente.

El hilo podría haber tenido un locking y estar en el medio de cambiar algún estado compartido, y el Thread.Abort deshará el locking y dejará el estado compartido dañado.

Es más fácil lastimarte a ti mismo. Como otros han declarado, plantea una excepción en el código, que puede ocurrir en cualquier punto. Esto podría estar bien si espera esto y ha codificado de una manera que maneja elegantemente esta excepción en cualquier punto, pero algunas personas no:

 Monitor.Enter(obj); // some code - if exception is raised here, then the lock isn't released Monitor.Exit(obj) IDisposable someCriticalResource = GetResource(); // some code - if exception is raised here, then the object isn't disposed someCriticalResource.Dispose(); 

Además, si trabajas con muchas personas en un equipo a menos que tengas buenas revisiones de código, no puedes garantizar la calidad del código con el que trabajarás. Por lo tanto, es una buena idea predicar el evangelio de “no Thread.Abort ()”, que lo que es hacer que la gente recuerde escribir código que sea robusto frente a excepciones que ocurran en cualquier lugar dentro de ese código.

En breve. Cualquier objeto IDisposable no puede ser eliminado. Cualquier objeto bloqueado no puede ser desbloqueado. Cualquier cosa que deba ser realizada al 100% nunca se realizará.

Cuando llama a Thread.Abort () en otro hilo, se inyecta una ThreadAbortException en el flujo de ese hilo. Si tiene suerte, el código se manejará bien y abortará en un estado bien definido. El problema es que no tienes manera de averiguar si tendrás suerte en todos los casos, por lo que si prefieres la seguridad antes que pedir perdón a Thread. Abordar otros hilos no es una buena idea.

Thread.Abort detiene tu hilo de una manera descontrolada. thread.Abort arrojará una excepción, que hará que el hilo se detenga de inmediato.

Lo que está mal con eso: en la mayoría de los casos, quiere detener con gracia la operación que está realizando. Por ejemplo, si está ejecutando una operación ACID, es posible que desee completar la operación actual antes de finalizar el hilo, para que su sistema permanezca en un estado estable.

Thread.Abort genera una excepción en el hilo de destino. Mientras tanto, el hilo de destino puede estar realizando algunas operaciones críticas y el aumento de una excepción puede romper el estado de su aplicación.