C# 如何使用BackgroundWorker事件RunWorkerCompleted

C# 如何使用BackgroundWorker事件RunWorkerCompleted,c#,winforms,backgroundworker,C#,Winforms,Backgroundworker,总之,我已经知道了BackgroundWorker在WinForm中处理多线程情况的基本用法。代码结构如下所示 在应用程序的主线程中。只要开始背景工作 if (backgroundWorker1.IsBusy != true) { // Start the asynchronous operation. backgroundWorker1.RunWorkerAsync(); } 然后它将触发DoWork事件。所以我们可以在那里做点什么 p

总之,我已经知道了
BackgroundWorker
在WinForm中处理多线程情况的基本用法。代码结构如下所示

在应用程序的主线程中。只要开始背景工作

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

RunWorkerCompletedEventArgs
中的
Result
属性是您在
DoWork()
中为
DoWorkEventHandler
的结果属性指定的值

您可以为它分配任何您喜欢的内容,因此可以返回整数、字符串、对象/复合类型等


如果在
DoWork()
中抛出异常,则您可以在
RunWorkerCompletedEventArgs
Error
属性中访问该异常。在这种情况下,访问Result属性将导致抛出一个
TargetInvocationException

您可以使用Result属性存储来自DoWork的任何结果,并从Completed事件访问它。但如果后台工作进程被取消或引发异常,则无法访问结果。你会发现更多的细节

然后是你使用它的班级

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

那么
错误
呢?这也是OP要求的。更新的答案。谢谢(在电话上阅读,却错过了)
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();
        }
    }
}