Cómo parar un thread
Artículo por Club Developers · 11 mayo 2006
2164 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.
vbnet
Imports System.Threading Public Class Threads   Inherits System.Windows.Forms.Form   ' ........     ' evento de señal de fin de thread private   Private _endThreadCalculsEvent As New AutoResetEvent(False)   ' para parar un thread private   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click     ' el evento pasa al estado señalado     _endThreadCalculsEvent.Set()     ' esperamos el final del thread.   End Sub   ' función del thread private   Private Sub ThrFunc1()     Try       Calculs(1000)     Catch ex As Exception       Debug.WriteLine(ex.ToString())     End Try   End Sub   Private Sub Calculs(ByVal tempo As Integer)   ' si el evento está en el estado señalado, WaitOne devuelve true y el bucle se termina.     While Not _endThreadCalculsEvent.WaitOne(tempo, False)       ' aquà será donde el thread hará su trabajo       ' .....     End While   End Sub End Class
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)
vbnet
' forzamos el fin del thread   Private Sub AbortThread()     ' pedimos al runtime que pare el Thread     _threadCalculs1.Abort()     ' esperamos el fin del thread   End Sub
Un threads terminado no puede ser relanzado, tendremos que instanciar un nuevo objeto Thread.