IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

BackGroundWorker - Ne s'arrête jamais


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Par défaut BackGroundWorker - Ne s'arrête jamais
    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

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Par défaut
    Personne n'est interessé par ma question?

    Ou ils vous manquent des infos pour m'aider?

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,

    Si mes souvenir de VB.net sont bons, on a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private WithEvents bgwCode As BackgroundWorker
    
    Private Sub bgwCode_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles bgwCode.RunWorkerCompleted
    ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private bgwCode As BackgroundWorker
     
    AddHandler bgwCode.RunWorkerCompleted, AddressOf bgwCode_RunWorkerCompleted
     
    Private Sub bgwCode_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs)
    Mais pas les deux. Est-ce que ton problème vient de là ?

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Par défaut
    Bonjour Ebastien,

    Avant tout, merci pour ta reponse.

    Alors, j'ai bien essayé les 2 cas, comme indiqué dans le doc. Soit avec le AddHandler, soit avec le Handles. Et dans aucun des cas, l'evenement n'est levé.

    J'avais déjà mis en place un backgroundworker dans une autre form, et j'ai repris la meme syntaxe pour la déclaration des events.

    J'ai du me louper dans mon copié collé pour la rédaction du message.

    J'ai pas pu prendre le temps de continuer a chercher, d'autres priorités sont apparus.

    Je suis toujours a l'ecoute d'un bon conseil pour résoudre ce probleme.

    Merci

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Par défaut
    Bonjour,

    Apres un peu de repos, la solution est apparue.

    Le retour dans Treatment ne renvoie pas toujours true, ce qui gene le backgroundworker.

    Maintenant, ca fonctionne.

    Merci de m'avoir lu.

    Nasty

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [OL-2007] AdvancedSearch ne s'arrête jamais
    Par Luc1an0 dans le forum VBA Outlook
    Réponses: 1
    Dernier message: 19/03/2009, 15h41
  2. [SSIS][SSMS][2k5] Le job ne s'arrête jamais
    Par clementratel dans le forum SSIS
    Réponses: 0
    Dernier message: 02/12/2008, 16h11
  3. le package ne s'arrête jamais ?
    Par Mathusalem dans le forum SSIS
    Réponses: 2
    Dernier message: 22/08/2008, 11h10
  4. [DOM] AJAX: le chargement de la page ne s'arrête jamais
    Par Amallric dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 20/07/2008, 11h05
  5. ventilos ne s'arrête jamais de tourner
    Par sweety107 dans le forum Composants
    Réponses: 9
    Dernier message: 02/09/2005, 16h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo