Bonjour,
Je rencontre des difficultés avec un backgroundworker.
J'ai suivi la documentation de glarde sur ce composant, mais j'ai encore un problème.
Je dois faire evoluer un bon vieux code, déjà existant. Et au vue des temps de reponses des differentes fonctionnalités, j'ai choisi de passer par un backgroundworker.
Mais dans mon cas, les evenements "ProgressChanged" et "RunWorkerCompleted" ne sont jamais appelés.
la déclaration du backgroundworker :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Public Class frmSynoptique Private WithEvents bgwCode As BackgroundWorkerFonction qui va lancer le backgroundworker
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 Private Sub frmSynoptique_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load [Declaration des variables] bgwCode = New BackgroundWorker bgwCode.WorkerReportsProgress = True bgwCode.WorkerSupportsCancellation = True AddHandler bgwCode.DoWork, AddressOf bgwCode_DoWork AddHandler bgwCode.RunWorkerCompleted, AddressOf bgwCode_RunWorkerCompleted AddHandler bgwCode.ProgressChanged, AddressOf bgwCode_ProgressChanged
Les objets CEMsgBox et CEMsgProgressBar sont des composants "maison" qui permettent d'afficher soit une messagebox soit une fenetre non modale avec une progressbar
Fonctions DoWork / ProgressChanged / RunWorkerCompleted du backgroundworker
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 Private Sub btnQuitter_ClickEvent(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles btnQuitter.Click Dim objProt As New CECommun.clsProtection Dim St As String Try objPlan.IntervalRefresh(0) If objCommun.CEMsgBox(Me, "Quitter", "QuitterCE2", "CE2 - Synoptique") Then 'Ajout de la demande de confirmation du backup / epuration 'Pour des raisons de confidentialités, la clause If est alterée If (true) Then If objCommun.CEMsgBox(Me, "Epuration", "EpuBackUp") Then 'Mise en place d'un backgroundworker msgbPB = objCommun.CEMsgProgressBar(Me, "Epuration", "Merci de patienter") bgwCode.RunWorkerAsync() While bgwCode.IsBusy 'On boucle dans le backgroundworker avant de lancer la fermetue de la fenetre. End While objCommun.CloseFrmMsgProgressBar(msgbPB) End If End If 'Suite de la fonction ....
Fonction treatment
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Private Sub bgwCode_DoWork(sender As Object, e As DoWorkEventArgs) Dim worker As BackgroundWorker = CType(sender, BackgroundWorker) If (Not WorkDone) Then e.Result = Treatment(worker, e) End If End Sub Private Sub bgwCode_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles bgwCode.RunWorkerCompleted Debug.WriteLine("End worker") End Sub Private Sub bgwCode_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles bgwCode.ProgressChanged objCommun.UpdateMsgProgressBar(msgbPB, 1) 'fonction qui va incrementer la progressbar msgbPB End Sub
Les différentes fonctions appelés dans Treatment étaient déjà existantes, elles ont été testés en amont et sont tout a fait fonctionnelles. Si je les teste en dehors du backgroundworker, je me retrouve avec une interface complètement freezé vu le temps qu'elles mettent a s’exécuter
Lors de l'execution, je rentre bien dans la fonction Treatment, tout se passe bien, aucune exception n'est levée.
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 Private Function Treatment(ByVal worker As BackgroundWorker, ByVal e As DoWorkEventArgs) As Boolean Dim result As Boolean = False Dim CodeSociete As String = objCommun.SocieteDef Dim Codecentrale As String = objCommun.CentraleDef 'BackUp de la base Try WorkDone = True If ProcessBackUp() Then worker.ReportProgress(15) 'Epuration de la base Dim dtFinEpu As String = DateTime.Now().AddMonths(-6).ToShortDateString() EpurationBL(dtFinEpu, CodeSociete, Codecentrale) worker.ReportProgress(35) EpurationBR(dtFinEpu, CodeSociete, Codecentrale) worker.ReportProgress(55) EpurationHisto(dtFinEpu, CodeSociete, Codecentrale) worker.ReportProgress(80) worker.ReportProgress(100) result = True Else 'Si on a echoué pendant le backup, on ne fait pas l'epuration result = False End If Catch ex As Exception result = False End Try 'objCommun.CloseFrmMsgProgressBar(msgbPB) Return result End Function
Par contre, le Worker.ReportProgress n'appelle pas la fonction bgwCode_ProgressChanged et a la fin du traitement, la fonction bgwCode_RunWorkerCompleted n'est pas appelé non plus.
Du coup, la suite de mon processus ne se lance pas. Je reste bloqué dans le "While bgwCode.IsBusy".
Si vous avez des idées sur le pourquoi du comment, je suis preneur.
Ca fait 3 jours que je me prend la tete dessus, toute aide sera la bienvenue.
Merci![]()
Partager