Exécution d’une méthode dans BackGroundWorker et affichage de ProgressBar

Ce que je veux, c’est quand une méthode est en train de faire une tâche, l’interface utilisateur rest active et que je veux montrer la progression du travail dans une barre de progression.

J’ai une méthode, un BackGroundWorker et une BackGroundWorker Progressbar . Je souhaite appeler la méthode lorsque BackGroundWorker commence à s’exécuter et affiche la progression. La méthode contient une boucle. Donc, il peut rendre compte des progrès.

Alors, que peut-on faire?

 private void Form1_Load(object sender, EventArgs e) { // TODO: This line of code loads data into the 'dataSet1.TBLMARKET' table. You can move, or remove it, as needed. myBGWorker.WorkerReportsProgress = true; } private void myBGWorker_DoWork(object sender, DoWorkEventArgs e) { parseFiles(); } private void myBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { myProgressBar.Value = e.ProgressPercentage; } private void myBGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { MessageBox.Show("Done"); } private void parseButton_Click(object sender, EventArgs e) { myBGWorker.RunWorkerAsync(); } public void parseFiles() { for() { //parsing myBGWorker.ReportProgress(...); } } 

Mais ça ne marche pas. La Progressbar ne se met pas à jour. Seul un petit progrès est visible après la MessageBox “Terminé”.

Au lieu d’utiliser une méthode ParseFiles (qui devrait dépendre de myBGWorker), utilisez une boucle et une méthode qui parsingnt un fichier. Signaler le pourcentage de progression dans cette boucle:

 private void parseButton_Click(object sender, EventArgs e) { parseButton.Enabled = false; myBGWorker.RunWorkerAsync(); } private void myBGWorker_DoWork(object sender, DoWorkEventArgs e) { for(int i = 0; i < filesCount; i++) { ParseSingleFile(); // pass filename here int percentage = (i + 1) * 100 / filesCount; myBGWorker.ReportProgress(percentage); } } void myBGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { myProgressBar.Value = e.ProgressPercentage; } void myBGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { parseButton.Enabled = true; MessageBox.Show("Done"); } 

À. soham.m17 utilisant avec l’argument de l’expéditeur

 private void myBGWorker_DoWork(object sender, DoWorkEventArgs e) { var worker = sender as BackgroundWorker; for(int i = 0; i < filesCount; i++) { ParseSingleFile(); // pass filename here int percentage = (i + 1) * 100 / filesCount; worker.ReportProgress(percentage); // use not myBGWorker but worker from sender } } 

Je suis désolé pour la question. En fait, le code fonctionne bien. Il ne montrait pas la myBGWorker.ReportProgress() Progressbar car l’argument dans myBGWorker.ReportProgress() était une fraction et non un pourcentage. Donc, ce n’était pas le montrer. Désolé pour le dérangement.

Le modérateur peut supprimer ce fil. Sinon, cela peut être un tutoriel pour les autres.