Running a method in BackGroundWorker and displaying a ProgressBar

What I want, when some method performs some task, the user interface remains active, and I want to show the progress in the progress bar.

I have a method a BackGroundWorker and a Progressbar . I want to call the method when BackGroundWorker starts working and shows the progress. The method contains a loop. In this way, he can report on progress.

So what can be done?

 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(...); } } 

But it does not work. Progressbar not updated. After the MessageBox "Finish" a little progress is shown.

+7
source share
3 answers

Instead of using a single ParseFiles method (which should depend on myBGWorker), use a loop and method that parse a single file. Percentage of progress in this cycle:

 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"); } 
+16
source

I apologize for the question. Actually the code is working fine. It did not show the Progressbar , since the argument in myBGWorker.ReportProgress() was a fraction, not a percentage. So he did not show it. Sorry for the inconvenience.

The moderator can delete this thread. Otherwise, it may be a tutorial for others.

0
source

K. soham.m17 use with sender argument

 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
source

All Articles