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

C# Discussion :

Utilisation du BackGroundWorker


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 62
    Points : 61
    Points
    61
    Par défaut Utilisation du BackGroundWorker
    Bonjour,

    J'utilise le BackGroundWorker pour afficher l'état d'avancement de la création de code barre dans un fichier excel.
    Malheureusement, il semble que j'ai loupé une astuce dans son utilisation.

    Tout d'abord j'ai mon appelant derrière un bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
           private void btnGenerateBarcode_Click(object sender, RoutedEventArgs e)
            {
                bw = new BackgroundWorker { WorkerSupportsCancellation = true, WorkerReportsProgress = true };
                bw.DoWork += bw_GenerateBarcode;
                bw.ProgressChanged += bw_ProgressChangedGenerateBarcode;
                bw.RunWorkerCompleted += bw_RunWorkerCompletedGenerateBarcode;
     
                if (!bw.IsBusy)
                    bw.RunWorkerAsync();
            }
    Ensuite j'ai le core de ma procédure

    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
    private void bw_GenerateBarcode(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker worker = (BackgroundWorker)sender;
    
                if (ExcelFilePathExist())
                {
                    using (Excel oExcel = new Excel())
                    {
                        BarCodeGenerator oBarCodeGenerator = new BarCodeGenerator();
                        int iRowCount, iColumnCount;
    
                        oExcel.Open(tbFichierExcel.Text);
                        iRowCount = oExcel.RowCount;
                        iColumnCount = oExcel.ColumnCount;
    
                        for (int iCount = 2; iCount <= iRowCount; iCount++)
                        {
                            if (worker.CancellationPending)
                            {
                                e.Cancel = true;
                                break;
                            }
                            string sBarCode;
                            string sRowValue;
    
                            //Get le field Ref Amps and convert it in BarCode
                            sRowValue = oExcel.ReadCell(iCount, 7);
                            sBarCode = oBarCodeGenerator.code128_pr_ttf(sRowValue);
    
                            //Register the barcode in excel
                            oExcel.WriteValueInCell(iCount, 14, sBarCode);
                            int pourcentage = iCount * 100 / iRowCount;
    
                            worker.ReportProgress( pourcentage);
                            //lbNumberOfBarCode.Content = "Nombre de Code Barre généré " + (iCount - 1).ToString()
                            //    + " / " + (iRowCount - 1).ToString();
                            //lbNumberOfBarCode.Refresh();
    
                        }
    
                        oExcel.Close(true);
                    }
                }
                else
                    MessageBox.Show("Veuillez selectionner le fichier excel de stock", "Erreur", MessageBoxButton.OK, MessageBoxImage.Exclamation);
            }
    Maleureusement l'application plante lors de l'exécution de la fonction ExcelFileExist (mis en rouge)

    Cette fonction est toute simple il vérifie si le champs avec le chemin d'accès est bien remplis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            private bool ExcelFilePathExist()
            {
                if (tbFichierExcel.Text == string.Empty)
                    return false;
                else
                    return true;
            }
    Malheureusement sur la ligne en bleu j'ai l'erreur suivante :
    InvalidOperationException : Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire.

    Détail de l'erreur : {L'évaluation des fonctions est désactivée, car une précédente évaluation des fonctions a dépassé le délai d'attente autorisé. Vous devez continuer l'exécution pour réactiver l'évaluation des fonctions.}

    Après différent test, je me rend compte que je n'ai accès à aucun des objets de ma form. Comment ce genre de chose doit être géré ?

    Merci d'avance.

  2. #2
    Membre chevronné
    Avatar de PixelJuice
    Homme Profil pro
    Ingénieur .NET & Game Designer
    Inscrit en
    Janvier 2014
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur .NET & Game Designer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 641
    Points : 2 160
    Points
    2 160
    Par défaut
    C'est tout a fait normal car les opérations inter-threads sont interdites depuis C# 2.0 je crois.

    Ton interface , ainsi que ses contrôles , sont gérer par un thread , qui est le thread principal. Le BackGroundWorker est un autre thread , du coup y accéder a l'un depuis l'autre est interdit sans passer par un delegate.

    Essaye de remplacer


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            private bool ExcelFilePathExist()
            {
                if (tbFichierExcel.Text == string.Empty)
                    return false;
                else
                    return true;
            }
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            private bool ExcelFilePathExist()
            {
                string contenuTextBox = "";
                this.Invoke(new MethodInvoker(delegate { contenuTextBox = tbFichierExcel.Text; }));
     
                if (contenuTextBox == string.Empty)
                    return false;
                else
                    return true;
            }
    Je te conseille aussi de jeter un oeil a Thread et delegate

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2013
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    Merci PixelJuice.

    En fait j'ai fait plus simple.
    J'ai simplement passé en paramètre le path de mon fichier lorsque je lance le Thread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            private void btnGenerateBarcode_Click(object sender, RoutedEventArgs e)
            {
                string excelPathName = tbFichierExcel.Text;
                bw = new BackgroundWorker { WorkerSupportsCancellation = true, WorkerReportsProgress = true };
                bw.DoWork += bw_GenerateBarcode;
                bw.ProgressChanged += bw_ProgressChangedGenerateBarcode;
                bw.RunWorkerCompleted += bw_RunWorkerCompletedGenerateBarcode;
    
                if (!bw.IsBusy)
                    bw.RunWorkerAsync(excelPathName);
            }

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

Discussions similaires

  1. Comment utiliser un backgroundworker (vb.net 2005) ?
    Par Aspic dans le forum Contribuez
    Réponses: 1
    Dernier message: 23/04/2013, 17h22
  2. Exemple d'utilisation du BackgroundWorker
    Par infosam76 dans le forum Contribuez
    Réponses: 0
    Dernier message: 06/12/2012, 22h15
  3. Utilisation du BackgroundWorker
    Par jlm22 dans le forum VB.NET
    Réponses: 12
    Dernier message: 15/04/2011, 16h13
  4. utilisation de BackgroundWorker
    Par infose dans le forum C#
    Réponses: 44
    Dernier message: 20/10/2010, 11h19

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