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 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
Fonction qui va lancer le backgroundworker
Les objets CEMsgBox et CEMsgProgressBar sont des composants "maison" qui permettent d'afficher soit une messagebox soit une fenetre non modale avec une progressbar

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
....
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
 
    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
Fonction treatment
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

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
Lors de l'execution, je rentre bien dans la fonction Treatment, tout se passe bien, aucune exception n'est levée.
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