Bonjour,
J'ai une boucle qui fait appel à plusieurs backgroundworker, et j'aimerai avancer dans ma boucle seulement quand le traitement de tous mes backgroundworker est fini.
Pour détailler un peu plus mon problème :
J'ai un ensemble de village appartenant à des zones d'études, pour chaque zone d'étude je lance 3 backgroundworker qui effectuent un traitement sur mes villages qui peut être assez long (qq secondes) puis je passe à la zone d'étude suivante. Il faut donc que le travail des backgroundworker sur la zone détude courante soit fini avant de passer à la zone d'étude suivante. Je n'arrive pas à programmer cette condition: voici mon code :
Dans cette version du code le thread principal reste blocké dans la boucle while même quand bgw1 et bgw2 ont fini leur traitement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 For i = 0 To gStudyAreaDictionary.Values.Count - 1 'Initialisation des listes de village sur lesquels travaillent chacun de mes bgw Dim ParamCalcul As ParamCalcul = fnCalculParamStudyArea(gDtset, dsParam, 1, gStudyAreaDictionary.Values(i).Name) If gStudyAreaDictionary.Values(i).Calculation Then For Each Vil As Village In gStudyAreaDictionary.Values(i).VillageList If iNbVill Mod 2 = 0 Then listVillage1.Add(Vil) Else listVillage2.Add(Vil) End If iNbVill = iNbVill + 1 Next While gBGW1.IsBusy Or BGW2.IsBusy System.Threading.Thread.Sleep(100) End While If listVillage1.Count <> 0 Then Dim ParamCalcul1 As ParamCalcul = ParamCalcul.Copy(listVillage1) gBGW1.RunWorkerAsync(ParamCalcul1) End If If listVillage2.Count <> 0 Then Dim ParamCalcul2 As ParamCalcul = ParamCalcul.Copy(listVillage2) gBGW2.RunWorkerAsync(ParamCalcul2) End If End If Next
J'ai essayé de mettre mes propres drapeaux à la fin des do_work de mes background worker pour voir quand le traitement est fini mais j'ai le problème inverse : lors de l'itération suivante de la boucle j'ai une erreur comme quoi le backgroundworker en question est toujours occupé alors que je sais que le do_work est fini. (J'ai mis à jour un booléan global just avant le endsub de l'évènement do_work des background worker)...
Une solution pour contourner ce problème serait de créer autant de bgw que de zones d'études mais à ce compte là je ne sais pas comment m'y prendre pour indiquer que faire à mes bgw dynamiques... Si je connais pas le nom de mon objet qui déclenche l'évènement do_work comment j'indique le traitement de cet évènement??
Partager