Cómo parar un thread
Artículo por Club Developers · 17 abril 2006
2683 vistas
Si una función de thread se ejecuta de forma contÃnua en un bucle, necesitaremos escribirlo de forma que con una condición pueda terminar dicho bucle. Esta condición tiene que poder ser modificada por otros threads. Retomemos el ejemplo del Form (ver FAQ [iurl=91&all=0&fs=464#467]Crear y lanzar un thread[/iurl]). Para señalar al thread que queremos que se detenga, vamos a usar un objeto de la clase System.Threading.AutoResetEvent. En el bucle de la función del thread hacemos esperar el thread durante un transcurso de tiempo. Si el objeto AutoResetEvent pasa al estado señalado, entonces salimos del thread.
Existe una manera más radical de parar un thread; es la utilización de la función Thread.Abort. Cuando se realiza una llamada a Abort, el Runtime eleva una excepción ThreadAbortException que el thread puede interceptar. Es por esto que se desaconseja usar Abort, porque no podemos saber dónde se encuentra el thread en ese momento. Elevar una excepción puede provocar que el thread termine en una zona de trabajo que deba realizarse por completo antes de salir. No obstante hay situaciones en que podemos usarla sin peligro, como: la función del thread está bloqueada infinitamente en una llamada (una espera de conexión socket por ejemplo)
Un threads terminado no puede ser relanzado, tendremos que instanciar un nuevo objeto Thread.
csharp
using System.Threading; public class Thread : System.Windows.Forms.Form {  // ........  // evento de señal de fin de thread private  // para parar un thread private  void Button2_Click(Object sender, System.EventArgs e)  {   // el evento pasa al estado señalado   _endThreadCalculsEvent.Set();   // esperamos el final del thread.   _threadCalculs1.Join();  }  // función del thread private  void ThrFunc1()  {   try   {    Calculs(1000);   }   catch (Exception ex)   {    Debug.WriteLine(ex.ToString());   }  }  private void Calculs(int tempor)  {   // si el evento está en el estado señalado, WaitOne devuelve true y el bucle se termina.   while (! _endThreadCalculsEvent.WaitOne(tempo, false) )   {    // aquà será donde el thread hará su trabajo    // .....   }  } }
Existe una manera más radical de parar un thread; es la utilización de la función Thread.Abort. Cuando se realiza una llamada a Abort, el Runtime eleva una excepción ThreadAbortException que el thread puede interceptar. Es por esto que se desaconseja usar Abort, porque no podemos saber dónde se encuentra el thread en ese momento. Elevar una excepción puede provocar que el thread termine en una zona de trabajo que deba realizarse por completo antes de salir. No obstante hay situaciones en que podemos usarla sin peligro, como: la función del thread está bloqueada infinitamente en una llamada (una espera de conexión socket por ejemplo)
csharp
// forzamos el fin del thread private void AbortThread() {  _threadCalculs1.Abort();  // pedimos al runtime que pare el Thread  _threadCalculs1.Join();  // esperamos el fin del thread }
Un threads terminado no puede ser relanzado, tendremos que instanciar un nuevo objeto Thread.