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
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 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(); }
Maleureusement l'application plante lors de l'exécution de la fonction ExcelFileExist (mis en rouge)
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); }
Cette fonction est toute simple il vérifie si le champs avec le chemin d'accès est bien remplis :
Malheureusement sur la ligne en bleu j'ai l'erreur suivante :
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; }
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.
Partager