65.9K
CodeProject is changing. Read more.
Home

Basic Backgroundworker

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (4 votes)

Feb 12, 2010

CPOL

1 min read

viewsIcon

51539

downloadIcon

2173

Demonstrate how to use backgroundworker

Introduction

Sometimes you just want a simple background thread that does the work and when it is completed, it will do something with the result. Microsoft has a backgroundworker component that works like a thread on a Windows Form. I wanted to demonstrate how to use the BackgroundWorker component.

Background

BackgroundWorker has three events:

  • DoWork - This will be the method that will handle the work when backgroundworker is invoked to run.
  • ProgressChanged - This is for reporting to a progress bar.
  • RunWorkerCompleted - Put code here for the return results of DoWork.

Using the Code

Setting up the Form.

Here I have:

  • 2 TextBoxes
  • 1 Label
  • 1 Button
  • 1 Progress Bar
  • 1 backgroundWorker (under Component Section on ToolBox)

The backgroundworker property WorkerReportProgress needs to be true to report progress:

How does the backgroundworker component run?

private void btnCalculate_Click(object sender, EventArgs e)
{
  MyStruct myStruct = new MyStruct(int.Parse(txtX.Text),int.Parse(txtY.Text));
  backgroundWorker1.RunWorkerAsync(myStruct);
  btnCalculate.Enabled = false;
}    

When button calculate is pressed, it will call the backgroundworker.RunWorkerAsync(object). RunWorkerAsync will trigger the event _DoWork.

In the backgroundWorker1_DoWork event is where you will put your code to do something.

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
 // Get the Object passed in
 MyStruct my = (MyStruct)e.Argument;
 // Do some work 
 for (int i = 0; i <= 10; i++)
 {
  backgroundWorker1.ReportProgress(i);
  Thread.Sleep(100);
 }
 // return the result 
 e.Result = my.X + my.Y;
}

e.Argument is important because that is how we will unbox the object passed into the backgroundworker component.

In this example will be just sleep and report progress. After a certain time it will calculate the result and return it back to the backgrroundWorker1_RunWorkerCompleted.

As the backgroundworker report progress it will update the _ProgressChanged.

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   progressBar1.Value = e.ProgressPercentage;
}

Finally when it is completed, it will return the result and we want to display the result so we put the code into the _RunWorkerCompleted.

private void backgroundWorker1_RunWorkerCompleted
	(object sender, RunWorkerCompletedEventArgs e)
{
    lblAnswer.Text = e.Result.ToString();
    btnCalculate.Enabled = true;
}

History

  • 11th February, 2010: Initial post