Stopper le backgroundworker [Résolu]

cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 26 janv. 2014 à 23:33 - Dernière réponse : cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention
- 28 janv. 2014 à 21:58
Bonjour,

J'esssaie de stopper le backgroundworker
'le clique doit stopper le backgroundworker
Private Sub ToolStripButtonNew_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ToolStripButtonNew.MouseDown
backgroundWorker1.WorkerSupportsCancellation = True
backgroundWorker1.CancelAsync()
End Sub

Private Sub Buttonvalid_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Buttonvalid.MouseClick
backgroundWorker1.RunWorkerAsync()
end sub

Private Sub backgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backgroundWorker1.DoWork

If backgroundWorker1.CancellationPending Then
e.Cancel = True
End If
end sub

le résultat si je clique sur le toolStripButtonNew et ensuite sur le boutonvalid
une exception à backgroundWorker1.RunWorkerAsync()
backgroundWorker1 n'est pas libre

merci
Afficher la suite 

Votre réponse

2 réponses

NHenry 14262 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 22 septembre 2018 Dernière intervention - 27 janv. 2014 à 12:58
0
Merci
Bonjour,

Pour annuler (ou stopper) un background worker, il faudrait déjà qu'il tourne.
Dans ton cas, tu fais juste un test (If backgroundWorker1.CancellationPending Then) puis tu sors de ton thread.
Commenter la réponse de NHenry
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 28 janv. 2014 à 21:58
0
Merci
Bonjour

en fait le problème est plus complexe car les sub appeler dans
le dowork sont executé par une class
j'ai réussi à résoudre le problème avec l'aide du forum voisin
ex
dans form1
class form1
private classmath as new classtoto
Private Sub Buttonvalid_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Buttonvalid.MouseClick
If Not backgroundWorker1.IsBusy Then
backgroundWorker1.RunWorkerAsync()
End If
end sub
Private Sub backgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backgroundWorker1.DoWork

If backgroundWorker1.CancellationPending Then
e.Cancel = True
End If
classmath.dosomething()

end sub

class toto

public sub dosomething()
'une boucle
while
if form1.backgroundWorker1.CancellationPending then
exit sub
end if
end while

end sub

end class

le gros problème et la surprise est quand la ligne
if form1.backgroundWorker1.CancellationPending dans la class
est exécuté une nouvelle instance de form1 est créer ou soit
un autre thread de form1

la solution passer en parametre la fonction .backgroundWorker1.CancellationPending

Private Sub backgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backgroundWorker1.DoWork
If backgroundWorker1.CancellationPending Then
e.Cancel = True
End If
classmath.dosomething(Function() backgroundWorker1.CancellationPending)

end sub

et dans la classtoto
public sub dosomething(ByVal isCancellationPending As Func(Of Boolean) )
while
if is CancellationPending then
exit sub
end if
end while


end sub
Commenter la réponse de cs_ShayW

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.