【问题标题】:How to use the BackgroundWorker event RunWorkerCompleted如何使用 BackgroundWorker 事件 RunWorkerCompleted
【发布时间】:2013-11-05 01:27:35
【问题描述】:

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

在应用程序的主线程中。只需启动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();
    }
}

【问题讨论】:

    标签: c# winforms backgroundworker


    【解决方案1】:

    RunWorkerCompletedEventArgs 中的Result 属性是您分配给DoWork()DoWorkEventHandler 的Result 属性的值。

    你可以给它分配任何你喜欢的东西,所以你可以返回一个整数、一个字符串、一个对象/复合类型等。

    如果在DoWork() 中抛出异常,那么您可以在RunWorkerCompletedEventArgsError 属性中访问该异常。在这种情况下,访问 Result 属性将导致TargetInvocationException 被抛出。

    【讨论】:

    • Error 怎么样?这也是 OP 要求的。
    • 更新了答案。谢谢。 (手机看,错过了)
    【解决方案2】:
    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();
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多