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 DoWork ne s'exécute pas


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut BackgroundWorker DoWork ne s'exécute pas
    Bonjour,

    J'utilise un BackgroundWorker pour effectuer une tâche longue (une boucle for avec environ 60000 boucles représentant le nombre de ligne d'un document).
    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
    33
    34
     
    'évènement qui permet de déclencher le thread d'arrière plan
    Private Sub lblMaJ_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lblMaJ.Click
     
            gpbMAJEnCours.Location = New Point(605, 106)
            gpbMAJEnCours.Size = New Size(307, 281)
            gpbMAJEnCours.Visible = True
     
            BackgroundWorkerMaJ.RunWorkerAsync()
     
    End Sub
     
    Private Sub BackgroundWorkerMaJ_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorkerMaJ.DoWork
     
    'Ici se trouve mes déclarations de variables utilisées pour ce 
    'traitement et ma boucle for
    End Sub
     
    'évènement  déclenché une fois DoWork terminé
    Private Sub BackgroundWorkerMaJ_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorkerMaJ.RunWorkerCompleted
     
            'compte le nbre d'éléments dans la listBox. Si vide message, sinon ouverture de la fenêtre frmModif
            If lstModif.Items.Count = 0 Then
     
                MessageBox.Show("Aucune donnée n'a été ajouté", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
     
            Else
     
                lblText.Text = "Liste des données qui ont été ajoutés dans la base de données:"
                gpbMAJEnCours.Size = New Size(641, 281)
     
            End If
     
        End Sub
    Mon problème se situe au niveau de l'évènement DoWork. Le contenu ne s'exécute pas (la boucle for n'est pas effectuée). L'évènement RunWorkerCompleted est délenché tout de suite après l'évènement DoWork. J'ai regardé cette page http://glarde.developpez.com/dotnet/bgworker/vb/ mais je n'ai pas trouvé de réponse.
    N'hésiter pas à poster si vous n'avez pas compris mon problème.
    Merci d'avance pour votre aide.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tu fais quoi au juste dans le DoWork ? Si j'en crois le code de ton RunWorkerCompleted, il semblerait que tu essaies d'ajouter des éléments à une ListBox... Or on ne peut faire ça qu'à partir du thread de l'interface graphique, sinon ça provoque une exception. Si ton DoWork se termine en erreur, tu peux récupérer l'exception via e.Error dans le RunWorkerCompleted.

    Essaie aussi de mettre un point d'arrêt dans ton DoWork pour voir ce qui se passe.

  3. #3
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    Dans DoWork, je récupère le code source d'un page web et j'extrais des données qui m'intéresse. Ces données sont ensuite ajouter à un listbox.

    Une fois DoWork terminé, dans RunWorkerCompleted, je cherche à savoir si il qq chose dans la listbox.
    J'ai regardé minutieusement le fenètre Exécution lors d'un pas à pas détaillé et j'ai remarqué ceci:
    Une exception de première chance de type 'System.InvalidCastException' s'est produite dans System.Windows.Forms.dll.
    Ceci ce produit lorsque je quitte l'évènement lblMaJ_Click et entre dans DoWork.
    Pourtant si je n'utilise aucun point d'arrêt, aucune erreur n'est signalée.

    De plus une fois le curseur du pas à pas détaillé sur Private.....DoWork..., il va directement à RunWorkerCompleted.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    OK donc a priori il se produit une erreur dans le DoWork, et donc il se termine et passe directement à RunWorkerCompleted. Il faudrait que tu montres un peu du code du DoWork pour qu'on voit ce qui ne va pas, mais à mon avis c'est lié au fait que tu essaies d'ajouter des éléments à la ListBox à partir du DoWork : comme je le disais dans mon précédent post, cela provoque une erreur.

    Quelle est la valeur de e.Error dans l'évènement RunWorkerCompleted ?

  5. #5
    Membre émérite Avatar de yonpo
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2010
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 617
    Par défaut
    J'ai ajouté msgbox(e.error) dans RunWorkerCompleted. Voila ce que j'ai:
    Aucun symbole n'a été chargé pour un frame de pile des appels. Le code source ne peut pas être affiché.
    Voici le code de DoWork:
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
     
    Private Sub BackgroundWorkerMaJ_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorkerMaJ.DoWork
     
            Dim strCodeSource As String
            Dim strTitre As String
            Dim intNbrLigne As Integer
            Dim intNb1 As Integer
            Dim intNb2 As Integer = 1
            Dim intNb3 As Integer
            Dim intNb4 As Integer = 1
            Dim i As Integer
     
            strCodeSource = wbMangaverse.Document.DomDocument.documentElement.innerHTML()
            intNbrLigne = (UBound(Split(strCodeSource, vbNewLine)) + 1)
     
     
            For i = 1 To intNbrLigne
     
     
                intNb1 = InStr(intNb2, strCodeSource, "<FONT color=#000033>")
     
                If intNb1 = 0 Then
     
                    Exit For
     
                End If
                intNb1 = InStr(intNb1, strCodeSource, ">")
                intNb3 = InStr(intNb1 + 1, strCodeSource, ">")
                intNb2 = InStr(intNb1, strCodeSource, "<")
                intNb4 = InStr(intNb2 + 1, strCodeSource, "<")
     
                If intNb2 = 0 Or intNb4 = 0 Then
     
                    Exit For
     
                End If
     
                If intNb3 > intNb2 And intNb4 > intNb2 And intNb2 <> intNb1 + 1 Then
     
                    strTitre = Mid(strCodeSource, intNb1 + 1, intNb2 - intNb1 - 1)
     
                    If strTitre.Contains("&amp;") = True Then
     
                        strTitre = strTitre.Replace("&amp;", "&")
     
                    End If
     
                    'on met deux aposthrophe si il y en a déjà un afin d'éviter une erreur dans la requete sql
                    If strTitre.Contains("'") = True Then
     
                        strTitre = strTitre.Replace("'", "''")
     
                    End If
     
                    dtsTM.Clear()
                    sqlTM = "SELECT Mangas, COUNT(*) AS NbreM FROM TousMangas Where Mangas= '" & strTitre & "' GROUP BY Mangas;"
                    cmdTM = New OleDbCommand(sqlTM)
                    dtaTM = New OleDbDataAdapter(cmdTM)
                    cmdTM.Connection() = cnx
                    dtaTM.Fill(dtsTM, "TousMangas")
                    dttTM = dtsTM.Tables("TousMangas")
     
                    'Mangas non présent dans la table TousMangas => on enregistre le titre
                    If rownumTM > dttTM.Rows.Count - 1 Then
     
                        'Création d'une nouvelle ligne
                        dtrTM = dtsTM.Tables("TousMangas").NewRow
     
                        'on remet un aposthrophe si il y en a 2
                        If strTitre.Contains("''") = True Then
     
                            strTitre = strTitre.Replace("''", "'")
     
                        End If
     
                        dtrTM("Mangas") = strTitre
     
                        'ajout de la ligne dans le DataSet
                        dtsTM.Tables("TousMangas").Rows.Add(dtrTM)
     
                        'création et exécution du commandbuilder pour mettre à jour le DataAdapter
                        cmdbTM = New OleDbCommandBuilder(dtaTM)
     
                        'mise à jour des données du DataAdapter à partir du commandbuilder
                        Try
     
                            dtaTM.Update(dtsTM, "TousMangas")
     
                        Catch ex As OleDbException
     
                            Exit Try
     
                        End Try
     
                        'on vide le dataset pour le recréer avec les nouvelles données 
                        dtsTM.Clear()
                        dtaTM.Fill(dtsTM, "TousMangas")
                        dttTM = dtsTM.Tables("TousMangas")
     
                        lstModif.Items.Add(strTitre)
                    End If
     
     
     
                Else
     
                    strTitre = Mid(strCodeSource, intNb3 + 1, intNb4 - intNb3 - 1)
     
                    If strTitre.Contains("&amp;") = True Then
     
                        strTitre = strTitre.Replace("&amp;", "&")
     
                    End If
     
                    'on met deux aposthrophe si il y en a déjà un afin d'éviter une erreur dans la requete sql
                    If strTitre.Contains("'") = True Then
     
                        strTitre = strTitre.Replace("'", "''")
     
                    End If
     
                    dtsTM.Clear()
                    sqlTM = "SELECT Mangas, COUNT(*) AS NbreM FROM TousMangas Where Mangas= '" & strTitre & "' GROUP BY Mangas;"
                    cmdTM = New OleDbCommand(sqlTM)
                    dtaTM = New OleDbDataAdapter(cmdTM)
                    cmdTM.Connection() = cnx
                    dtaTM.Fill(dtsTM, "TousMangas")
                    dttTM = dtsTM.Tables("TousMangas")
     
                    'Mangas non présent dans la table TousMangas => on enregistre le titre
                    If rownumTM > dttTM.Rows.Count - 1 Then
     
                        'Création d'une nouvelle ligne
                        dtrTM = dtsTM.Tables("TousMangas").NewRow
     
                        'on remet un aposthrophe si il y en a 2
                        If strTitre.Contains("''") = True Then
     
                            strTitre = strTitre.Replace("''", "'")
     
                        End If
     
                        dtrTM("Mangas") = strTitre
     
                        'ajout de la ligne dans le DataSet
                        dtsTM.Tables("TousMangas").Rows.Add(dtrTM)
     
                        'création et exécution du commandbuilder pour mettre à jour le DataAdapter
                        cmdbTM = New OleDbCommandBuilder(dtaTM)
     
                        'mise à jour des données du DataAdapter à partir du commandbuilder
                        Try
     
                            dtaTM.Update(dtsTM, "TousMangas")
     
                        Catch ex As OleDbException
     
                            Exit Try
     
                        End Try
     
                        'on vide le dataset pour le recréer avec les nouvelles données 
                        dtsTM.Clear()
                        dtaTM.Fill(dtsTM, "TousMangas")
                        dttTM = dtsTM.Tables("TousMangas")
     
                        lstModif.Items.Add(strTitre)
                    End If
                End If
            Next
        End Sub

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Aucun symbole n'a été chargé pour un frame de pile des appels. Le code source ne peut pas être affiché.
    Euh, ça c'est pas un message d'erreur, c'est juste visual studio qui dit qu'il n'a pas de code pour l'emplacement où il s'est arrêté...

    N'utilise pas de MessageBox pour ça, mets un breakpoint dans le RunWorkerCompleted, et regarde la valeur de e.Error dans le debugger

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

Discussions similaires

  1. [BackgroundWorker] Pourquoi parfois DoWork ne s'execute pas ?
    Par backseatgreg dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 23/08/2006, 10h50
  2. Réponses: 13
    Dernier message: 30/01/2006, 14h21
  3. mon programe asp ne s'exécute pas????????????
    Par ghita269 dans le forum ASP
    Réponses: 1
    Dernier message: 07/11/2005, 11h23
  4. jar Eclipse/bureau -> exécute pas mes requetes !!!
    Par Elea49 dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 04/08/2005, 15h11
  5. Réponses: 3
    Dernier message: 09/10/2002, 11h35

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