2011-05-08 16 views
5

Para leer el título, ¿cuándo no se abortará Thread.Abort()? He oído a mucha gente decir que es un comando peligroso y que nunca está garantizado que funcione, pero nunca he podido reproducirlo. Siempre ha trabajado para mí ..¿Cuándo no se abortará realmente Thread.Abort()?

¿Hay alguna situaciones específicas que podrían causar Thread.Abort() falle consistentemente?

Respuesta

9

¿Has leído the documentation?

No se garantiza que el subproceso aborte inmediatamente, o no se realice. Esta situación puede ocurrir si un subproceso realiza una cantidad ilimitada de cómputos en los bloques finally que se invocan como parte del procedimiento de cancelación, lo que demora indefinidamente el aborto. Para esperar hasta que se anule un hilo, puede llamar al método Join en el hilo después de llamar al método Abort, pero no hay garantía de que la espera termine.

...

Si Abortar se llama en un hilo que no se ha iniciado, el hilo se interrumpirá cuando se llama Start. Si se llama a Abortar en un hilo que está bloqueado o está durmiendo, el hilo se interrumpe y luego se interrumpe.

Si se invoca Abortar en un hilo que se ha suspendido, se lanza una ThreadStateException en el hilo que llamó Abort, y AbortRequested se agrega a la propiedad ThreadState del hilo que se abortó. Una ThreadAbortException no se lanza en el hilo suspendido hasta que se llame a Reanudar.

Si se invoca Abortar en un subproceso administrado mientras se está ejecutando código no administrado, no se lanza una ThreadAbortException hasta que el subproceso vuelva al código administrado.

Si se producen dos llamadas a Abort al mismo tiempo, es posible que una llamada configure la información de estado y la otra llamada ejecute Abort. Sin embargo, una aplicación no puede detectar esta situación.

Después de invocar el Aborto en un hilo, el estado del hilo incluye AbortRequested. Una vez que el hilo ha terminado como resultado de una llamada exitosa a Abort, el estado del hilo se cambia a Detenido. Con suficientes permisos, un hilo que es el objetivo de un aborto puede cancelar el aborto usando el método ResetAbort. Para ver un ejemplo que muestra cómo llamar al método ResetAbort, consulte la clase ThreadAbortException.

+1

gracias ... hice una búsqueda en google pero no encontré la documentación en los resultados de búsqueda, quizás en el futuro examinaré más a fondo msdn. – caesay

+0

no pensé en buscar tan simplemente. – caesay

+0

@ ta.speot.is Es una pena que no hayas recibido más votos, esta es la mejor respuesta en Thread. Problemas de aborto que he visto :). – ipavlu

Cuestiones relacionadas