如何使用BackgroundWorker事件RunWorkerCompleted

8
大家好,本人已经了解了在WinForm中处理多线程情况的基本BackgroundWorker使用方法。代码结构如下:
在应用程序的主线程中,只需启动BackgroundWork即可。
    if (backgroundWorker1.IsBusy != true)
    {
        // Start the asynchronous operation.
        backgroundWorker1.RunWorkerAsync();
    }

然后它会触发DoWork事件。因此我们可以在其中执行一些操作。

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

然后我们只需要处理 ProgressChanged 事件来显示 BackgroundWorker 的进度。

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

在DoWork方法完成或发生异常后,会触发RunWorkerCompleted事件。

以下是我对此事件处理程序的问题,请帮忙检查。谢谢。

我注意到在RunWorkerCompletedEventArgs e中有一个名为“Result”的属性,它有什么用途?我该如何使用它?

是否有可能接收到我的自定义异常消息而不是e.error?如果有,怎样才能实现呢?

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();
    }
}
3个回答

17
RunWorkerCompletedEventArgs中的Result属性是你在DoWork()里赋值给DoWorkEventHandlerResult属性的值。
你可以把任何你喜欢的东西赋值给它,所以你可以返回一个整数、一个字符串,一个对象/复合类型等等。
如果在DoWork()中抛出异常,则可以在RunWorkerCompletedEventArgsError属性中访问异常。在这种情况下,访问结果属性会导致抛出TargetInvocationException

“Error”怎么样?这也是OP所问的。 - King King
1
更新了答案。谢谢。(在手机上阅读时错过了它) - SimonGoldstone

7
public class MyWorkerClass
{
    private string _errorMessage = "";
    public string ErrorMessage { get { return _errorMessage; } set { _errorMessage = value; }}

    public void RunStuff(object sender, DoWorkEventArgs e)
    {
        //... put some code here and fill ErrorMessage whenever you want
    }
}

然后在使用它的类中。
public class MyClassUsingWorker
{
    // have reference to the class where the worker will be running
    private MyWorkerClass mwc = null;

    // run the worker
    public void RunMyWorker()
    {
        mwc = new MyWorkerClass();
        BackgroundWorker backgroundWorker1 = new BackgroundWorker();
        backgroundWorker1.DoWork += new DoWorkEventHandler(mwc.RunStuff);
        backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
        backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        string strSpecialMessage = mwc.ErrorMessage;

        if (e.Cancelled == true)
        {
            resultLabel.Text = "Canceled!";
        }
        else if (e.Error != null)
        {
            resultLabel.Text = "Error: " + e.Error.Message;
        }
        else
        {
            resultLabel.Text = e.Result.ToString();
        }
    }
}

1
您可以使用Result属性存储DoWork的任何结果,并从Completed事件中访问它。但是,如果后台工作进程被取消或引发异常,则无法访问结果。您可以在这里找到更多详细信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接