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:
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:
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:
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.