arreter un thread,thread abort, catch ThreadAbortException
bonjour ricky
pour arreter un thread parmi -n thread paralleles-demarres à partir d'un thread principal il suffit d'appeler Abort.Thread avec numero de thread et de catcher ThreadAbortException dans la tache gere par ce thread.
code exemple pour etre plus clair:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
'Forme lance la methode shared Main de la classe TesteurAbortThread
Public Class Form1
Public Sub New()
' Cet appel est requis par le Concepteur Windows Form.
InitializeComponent()
' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
Me.TextBox1.Multiline = True
Me.TextBox1.ScrollBars = ScrollBars.Both
End Sub
'
'Recupere le deroulement tache dans le TextBox1
Private Sub btnTesteurAbort_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTesteurAbort.Click
'demarre les threads
TesteurAbortThread.Main()
'Recupere le deroulement tache dans le TextBox1
Me.TextBox1.Text = Me.TextBox1.Text & TesteurAbortThread.strMessage & vbCrLf
End Sub
End Class
'Classe manager d'un groupe de threads
Option Strict On
Imports System
Imports System.Threading
Public Class TesteurAbortThread
'permet de recuperer le deroulement des 2 taches
'"Incremeteur" & "Decrementeur"
Public Shared strMessage As String
Shared Sub Main()
' cree une instance de cette classe
Dim objAbortThread As New TesteurAbortThread()
TesteurAbortThread.strMessage = ""
' Executer en dehors de Main
objAbortThread.FaireTest()
End Sub 'Main
Public Sub FaireTest()
' cree un tableau de 3 threads sans noms
Dim mesThreads As Thread() = _
{New Thread(New ThreadStart(AddressOf Decrementeur)), _
New Thread(New ThreadStart(AddressOf Incrementeur)), _
New Thread(New ThreadStart(AddressOf Incrementeur))}
' demarre chaque thread
Dim numThread As Integer = 0
Dim monThread As Thread
For Each monThread In mesThreads
monThread.IsBackground = True
monThread.Start()
monThread.Name = "Thread-" + numThread.ToString()
numThread += 1
TesteurAbortThread.strMessage = TesteurAbortThread.strMessage & "Started demarre " & monThread.Name & vbCrLf
'intervalle de temps entre chaque thread 50 ms
Thread.Sleep(50)
Next monThread
' Apres avoir demarre les 3 threads
' Demander au 1er thread d'abandonner(qui gere Decrementer)
mesThreads(0).Abort()
' Attendre la fin des autres threads avant de faire un resume sur thread principal
Dim objTread As Thread
For Each objTread In mesThreads
objTread.Join()
Next objTread
' Apres la fin de tous les threads , imprimer un message
TesteurAbortThread.strMessage = TesteurAbortThread.strMessage & "Tous les threads sont termines..." & vbCrLf
End Sub 'FaireTest
'Tache1 Compteur à partir 1000 à rebours
Public Sub Decrementeur()
Try
Dim I As Integer
For I = 1000 To 0 Step -1
'Console.WriteLine("Thread {0}. Decrementeur: {1}", _
' Thread.CurrentThread.Name, i)
TesteurAbortThread.strMessage = TesteurAbortThread.strMessage & "Thread . Decrementeur: " & Thread.CurrentThread.Name & " " & I.ToString & vbCrLf
Thread.Sleep(0)
Next I
'ICI LE CATCH ThreadAbortException qui permet l'arret
Catch e As ThreadAbortException
TesteurAbortThread.strMessage = TesteurAbortThread.strMessage & "***Thread abandonné! Nettoyage resources..." & Thread.CurrentThread.Name & vbCrLf
Finally
TesteurAbortThread.strMessage = TesteurAbortThread.strMessage & "Thread abandonné En train de Sortir.... " & Thread.CurrentThread.Name & vbCrLf
End Try
End Sub 'Decrementeur
'Tache2 Compteur jusqu'à 1000
Public Sub Incrementeur()
Try
Dim I As Integer
For I = 0 To 1000
TesteurAbortThread.strMessage = TesteurAbortThread.strMessage & "Thread . Incrementeur: " & Thread.CurrentThread.Name & " " & I.ToString & vbCrLf
Thread.Sleep(0)
Next I
Catch
Finally
TesteurAbortThread.strMessage = TesteurAbortThread.strMessage & "Thread En train de Sortir normalement..... " & Thread.CurrentThread.Name & vbCrLf
End Try
End Sub 'Incrementeur
End Class 'TesteurAbortThread |
en resume:
si l'on veut "aborter" un thread -x- quelconque il suffit de catcher dans- chaque tache -i-execute par ce thread - l'exception ThreadAbortException.
bon code.......
arret de thread à partir du thread principal
bonjour pol
je ne vois aucune methode dans l'api qui permettrait d'arreter un thread à partir du thread principal mis à part Thread.Abort.
Le seul moyen est de gerer proprement l'exception ThreadAbortException
dans le Catch et dans le Finally en y incluant un petit appel à ResetAbort pour permettre au "thread abandonne" de terminer la tache en cours et un appel à Thread.Join dans le Thread Principal pour attendre une fin "propre" du "thread abandonne" .
code extrait de l'API MSDN à l'attention de ricky:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
Imports System
Imports System.Threading
Imports System.Security.Permissions
Public Class ThreadWork
Public Shared Sub DoWork()
Try
Dim i As Integer
For i = 0 To 99
Console.WriteLine("Thread - working.")
Thread.Sleep(100)
Next i
Catch e As ThreadAbortException
Console.WriteLine("Thread - caught ThreadAbortException - resetting.")
Console.WriteLine("Exception message: {0}", e.Message)
Thread.ResetAbort()
End Try
Console.WriteLine("Thread - still alive and working.")
Thread.Sleep(1000)
Console.WriteLine("Thread - finished working.")
End Sub 'DoWork
End Class 'ThreadWork
Class ThreadAbortTest
Public Shared Sub Main()
Dim myThreadDelegate As New ThreadStart(AddressOf ThreadWork.DoWork)
Dim myThread As New Thread(myThreadDelegate)
myThread.Start()
Thread.Sleep(100)
Console.WriteLine("Main - aborting my thread.")
myThread.Abort()
myThread.Join()
Console.WriteLine("Main ending.")
End Sub 'Main
End Class 'ThreadAbortTest |
l'Api MSDN signale que AppDomain utilise cette methode lors de son dechargement,à toutes fins utiles....
bon code......