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.