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 :

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
Dans cette version du code le thread principal reste blocké dans la boucle while même quand bgw1 et bgw2 ont fini leur traitement.

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??