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é".
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");
}
À. 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
}
}
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.