Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Running a method in BackGroundWorker and Showing ProgressBar

What I want is when some method is doing some task UI keeps itself active and I want to show the progress of the work in a progress-bar.

I have a method, a BackGroundWorker and a Progressbar. I want to call the method when BackGroundWorker starts running and show the progress. The method contains a loop. So, it can report the 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's not working. The Progressbar is not updating. Only a small progress is showing after the MessageBox "Done".

like image 483
soham Avatar asked Dec 14 '12 06:12

soham


People also ask

How do I set ProgressBar value?

To set the ProgressBar value directly In code, set the control's Value property to an integer value between the minimum and maximum values you have established. If you set the Value property outside the boundaries established by the Minimum and Maximum properties, the control throws an ArgumentException exception.

How does DoWork pass parameters to BackgroundWorker?

You can send a parameter to the background operation using the RunWorkerAsync() method. You can receive this parameter by using the Argument property of the instance of DoWorkEventArgs in the DoWork event handler then you cast it to use it in the background operation.

What is use of BackgroundWorker in C#?

BackgroundWorker makes the implementation of threads in Windows Forms. Intensive tasks need to be done on another thread so the UI does not freeze. It is necessary to post messages and update the user interface when the task is done.

Is BackgroundWorker threaded?

BackgroundWorker, is a component in . NET Framework, that allows executing code as a separate thread and then report progress and completion back to the UI.


1 Answers

Instead of using one ParseFiles method (which should depend on myBGWorker) use loop and method which parse one file. Report progress percentage in that loop:

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");
}
like image 122
Sergey Berezovskiy Avatar answered Oct 14 '22 16:10

Sergey Berezovskiy