2009-04-02 19 views
5

He leído en varios sitios web que Thread.Abort no es muy bueno para usar. En este caso, ¿cómo implementar un patrón de tiempo de espera? Por ejemplo, he leído que MS usa el siguiente patrón (que he incluido en un método de extensión) en todo el marco. Personalmente, creo que esta es una extensión genial, pero estoy preocupado por el Thread.Abort. ¿Alguien tiene una mejor manera?Patrón de tiempo de espera - ¿Qué tan malo es Thread.Abort realmente?

public static bool CallandWait(this Action action, int timeout) 
    { 
     Thread subThread = null; 
     Action wrappedAction =() => 
     { 
      subThread = Thread.CurrentThread; 
      action(); 
     }; 

     IAsyncResult result = wrappedAction.BeginInvoke(null, null); 

     if (((timeout != -1) && !result.IsCompleted) && (!result.AsyncWaitHandle.WaitOne(timeout, false) || !result.IsCompleted)) 
     { 
      if (subThread != null) 
      { 
       subThread.Abort(); 
      } 

      return false; 
     } 
     else 
     { 
      wrappedAction.EndInvoke(result); 
      return true; 
     } 
    } 

Respuesta

2

Es malo porque el hilo podría estar en un estado incoherente o en el medio de un trabajo, y no tener la oportunidad de borrar a sí mismo.

Para cerrarlo correctamente, le indicará que deje de hacer lo que está haciendo llamando a un método o estableciendo una propiedad, luego realice el Subproceso. Para esperar hasta que se cierre antes de cerrar la aplicación o pasar a otras tareas.

13

Básicamente, estás hablando de abortar una acción que (hasta donde sabemos) no tiene forma elegante de abortar.

Eso significa que no va a haber seguro manera de abortarlo. Thread.Abort simplemente no es una buena cosa que hacer, existen varias condiciones de carrera y situaciones desagradables en las que puede participar (consulte el enlace en Richard's answer). Intentaré desesperadamente evitar cancelar acciones que no saben sobre cancelación, y si absolutamente tiene para hacerlo, considere reiniciar toda la aplicación después, ya que puede que ya no esté en buen estado.

Cuestiones relacionadas