web-dev-qa-db-fra.com

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 reste active et que je veux montrer l'avancement du travail dans une barre de progression.

J'ai une méthode, une BackGroundWorker et une 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 n'est pas mise à jour. Seul un petit progrès est visible après la MessageBox "Terminé".

9
soham

Au lieu d'utiliser une méthode ParseFiles (qui devrait dépendre de myBGWorker), utilisez une boucle et une méthode qui analysent 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");
}
20
Sergey Berezovskiy

À. soham.m17 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
   }
}
0
Namo

Je suis désolé pour la question. En fait, le code fonctionne bien. Il ne montrait pas la 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.

0
soham