Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use the BackgroundWorker event RunWorkerCompleted

All,I already knew the basic usage the BackgroundWorker to handle multiple thread case in the WinForm . And the code structure looks like below.

In the main thread of application. just start the BackgroundWork.

    if (backgroundWorker1.IsBusy != true)
    {
        // Start the asynchronous operation.
        backgroundWorker1.RunWorkerAsync();
    }

Then it would fire the DoWork event . So we can do something in there.

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    ......
    // report progress.
    worker.ReportProgress(iProgress);
    ....
}

Then we just need to handle the ProgressChanged event to show the BackgroundWorker progress.

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //show progress.   
    resultLabel.Text = (e.ProgressPercentage.ToString() + "%");
}

After DoWork finished or some exception happened. the event RunWorkerCompleted would be fired.

Here comes my questions for this events handle. please help to review them. thanks.

I noticed there is property named 'Result' in the RunWorkerCompletedEventArgs e, What does it use for? How can I use it ?

Is there any possibility to receive my custom exception message instead the e.error? If there is, How to make it ?

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled == true)
    {
        resultLabel.Text = "Canceled!";
    }
    else if (e.Error != null)
    {
        resultLabel.Text = "Error: " + e.Error.Message;
    }
    else
    {
        resultLabel.Text = e.Result.ToString();
    }
}
like image 633
Joe.wang Avatar asked Nov 01 '13 09:11

Joe.wang


1 Answers

The Result property in RunWorkerCompletedEventArgs is the value you have assigned to the Result property of DoWorkEventHandler in DoWork().

You can assign anything you like to this, so you could return an integer, a string, an object/composite type, etc.

If an exception is thrown in DoWork() then you can access the exception in the Error property of RunWorkerCompletedEventArgs. In this situation, accessing the Result property will cause an TargetInvocationException to be thrown.

like image 77
SimonGoldstone Avatar answered Sep 22 '22 12:09

SimonGoldstone