Le meilleur moyen de d'arrêter un thread est de laisser sa fonction se terminer.
Si une fonction de thread s'execute en continu dans une boucle, il est nécéssaire d'écrire un code qui prévoit une condition pour sortir de la boucle. Cette doit pouvoir être modifié par d'autres threads.
Reprenons l'exemple de notre Form (voir Q/R création d'un thread).
Pour signaler au thread que nous souhaitons qu'il s'arrête, nous allons utiliser un objet de la classe System.Threading.AutoResetEvent.
Dans la boucle de la fonction du thread, nous faisons attendre le thread pendant un court laps de temps. Si l'objet AutoResetEvent passe à l'état signalé, alors on sort du thread.
Imports System.Threading
Public Class Threads
Inherits System.Windows.Forms.Form
Private _endThreadCalculsEvent As New AutoResetEvent(False)
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
_endThreadCalculsEvent.Set()
_threadCalculs1.Join()
End Sub
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)
While Not _endThreadCalculsEvent.WaitOne(tempo, False)
End While
End Sub
End Class
Il existe un moyen plus radical d'arrêter un thread, c'est l'utilisation de la fonction Thread.Abort.
Lorsque vous appelez Abort, le Runtime lève une exception ThreadAbortException que le thread peut alors intercepter.
C'est aussi pourquoi il est déconseillé d'utiliser Abort car on ne peut prévoir où en est le thread dans son traitement.
Lever une exception peut interrompre le thread alors qu'il est dans une partie du code qu'il doit terminer avant de sortir.
Un des exemples où on peut utiliser Abort sans risque : la fonction du thread est bloquée infiniment sur un appel
(une attente de connexion socket par exemple)
Private Sub AbortThread()
_threadCalculs1.Abort()
_threadCalculs1.Join()
End Sub
Un thread terminé ne peut plus être relancé. Il faut instancier un nouvel objet Thread pour chaque démarrage de thread.
|