Thread.Abort vs Thread.Interrupt

Si necesito cancelar alguna operación en un hilo, ¿cuándo debo usar Thread.Abort vs Thread.Interrupt. Leí la documentación, pero no estoy seguro de qué scneario debo usar para una llamada en particular entre dos.

Si hay alguna tercera forma de hacerlo, déjeme saberlo también con los pros y los contras.

preguntado el 10 de mayo de 11 a las 13:05

¿Por qué quieres matar un hilo en primer lugar? El asesinato es malo, haz que se suicide. -

¿No es la mejor solución para realmente cancelar la operación en el hilo, en lugar de intentar matar el hilo? -

en realidad está relacionado con otra pregunta que hice en un hilo diferente stackoverflow.com/questions/5942688/… -

4 Respuestas

Yo evitaría usar Thread.Abort cueste lo que cueste. Su comportamiento es mucho más seguro y predecible desde .NET 2.0, pero todavía presenta algunos escollos bastante serios. La mayoría de los abortos dentro del código administrado se pueden hacer seguros, pero no todos. Por ejemplo, creo que hay algunos problemas sutiles si se activa una solicitud de cancelación durante el procesamiento de un constructor estático. No importa, el hecho de que la excepción fuera de banda puede ocurrir en cualquier momento, lo que le da poco control sobre la definición de dónde se encuentran los puntos seguros para el apagado.

Hay varias formas aceptables de terminar un hilo con elegancia.

  • Utilización de Thread.Interrupt
  • Sondear una bandera de parada
  • Utilización de WaitHandle Eventos
  • Llamadas a API especializadas

Discuto estos métodos en mi respuesta. aquí.

contestado el 23 de mayo de 17 a las 15:05

"si aborta un hilo mientras está en código no administrado" Estoy bastante seguro de que Thread.Abort espera hasta que regrese al código administrado. Al igual que un hilo que está en un finally El bloque no terminará hasta que haya terminado finalmente. - CódigosInChaos

@CodeInChaos: Ah ... tal vez sea más seguro de lo que creo. Buscaré eso. - Brian Gideon

@CodeInChaos: Sí, lo dice aquí msdn.microsoft.com/en-us/library/74169f59.aspx en el último párrafo. ¡Buena atrapada! - Brian Gideon

@Brian: En los comentarios de la pregunta anterior, agregué un enlace para brindarle una mejor imagen del contexto de dónde necesito abortar este hilo. Dado que este hilo está llamando a un servicio web, de su lista de formas aceptables, parece que Thread.Interrupt es la única solución posible que puedo usar. Dado que este hilo solo está llamando a una API desde el servicio web y el usuario quiere cancelar esta operación, no hay mucho que pueda hacer excepto cerrar ese hilo. ¿Estás de acuerdo? - Estudiante de Silverlight

@Silverlight: en ese caso, es posible que pueda cerrar el canal de servicio web subyacente. Con suerte, eso hará que la llamada regrese o lance una excepción de inmediato. Esto se incluiría en la cuarta opción de llamadas a API especializadas. - Brian Gideon

La mayoría de las sugerencias ya están hechas, pero aquí hay un ejemplo de cómo lo haría:

    ManualResetEvent _requestTermination = new ManualResetEvent(false);
    Thread _thread;

    public void Init()
    {
        _thread = new Thread(() =>
         {

             while (!_requestTermination.WaitOne(0))
             {
                 // do something usefull

             }

         }));

        _thread.Start();
    }

    public void Dispose()
    {
        _requestTermination.Set();

        // you could enter a maximum wait time in the Join(...)
        _thread.Join();
    }

De esta forma, el desecho esperará hasta que el hilo haya salido.


Si necesita un retraso dentro del hilo, no debe agregar Thread.Sleep. Utilice WaitOne (delayTime). De esta forma nunca tendrás que esperar para finalizarlo.

Respondido 09 Oct 19, 10:10

Yo no usaría Thread.Abort alguna vez. Provoca una excepción en un momento casi arbitrario.

contestado el 10 de mayo de 11 a las 17:05

¿Puede detallar el tiempo arbitrario aquí? ¿No intenta eliminar el hilo justo en el momento en que se realiza la llamada Abort? Cualquier enlace como referencia a su estado de cuenta también será de ayuda. - Estudiante de Silverlight

No abortará dentro de una cláusula finalmente, dentro de una cláusula try saltará directamente a la finalmente, se puede capturar temporalmente pero se volverá a lanzar al final del bloque catch, y desde .net 4 el lock La declaración funciona como se esperaba. Pero puede romper el using declaración. Lo que para mí es suficiente para no usarlo nunca. - CódigosInChaos

Ten cuidado con Thread.Interrupt. Si no incorporas algo de tiempo de espera o para dormir, el hilo no se interrumpirá.

Ten cuidado con Thread.Abort. Si atrapas el ThreadAbortException su hilo terminará justo después de la captura + finalmente.

(Me gusta usar esos métodos para enviar una señal a mi hilo para que sepa que es hora de finalización, luego limpiar y salir).

Respondido 09 ago 13, 15:08

En los catch-bloque tienes que llamar Thread.ResetAbort(). Solo en aras de la integridad. - Paul Kertscher

@PaulKertscher No, no es necesario. Cuando usas aborto involuntario Usted enlatado utilizado ResetAbort rechazar el aborto o continuar con código extra Si lo envía después captura + finalmente (y tu bucle). - Azul amargo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.