【问题标题】:In BackgroundWorker: RunWorkerCompleted's e.Error == null even in case of error在BackgroundWorker中:RunWorkerCompleted的e.Error == null 即使出现错误
【发布时间】:2015-04-23 12:16:18
【问题描述】:

当我把 try catch 块放在我的时间任务中时。在 RunWorkerCompleted() 方法中, e.error 使用为空。当我删除 try catch 块时,在 RunWorkerCompleted() 方法中,e.error 不等于 null。

为什么会出现这种奇怪的行为?

代码:

  public partial class LoginForm : Form
{
    private static BackgroundWorker bw = new BackgroundWorker();
    private static ManualResetEvent mre = new ManualResetEvent(false);

    enum status
    {
        Blank,
        Success,
        Error
    };

    public LoginForm()
    {
        InterimProceedings();
        InitializeComponent();
    }

    private void InterimProceedings()
    {
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);

        if (!bw.IsBusy)
        {
            bw.RunWorkerAsync();
        }
        else
        {
            throw new InvalidOperationException("BackgroundWorker is busy");
        }
    }

    private static void bw_DoWork(object sender, DoWorkEventArgs e)
    {
      //  Time taking task
          mre.Set();
    }

    private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (!(e.Error == null))
        {
            this.lbl_status.Text = "Cannot proceed, Error occured";
            appStatus = status.Error;
        }
        else
        {
            this.lbl_status.Text = "Good to go...";
            appStatus = status.Success;
        }
    }

    private void btn_login_Click(object sender, EventArgs e)
    {
        mre.WaitOne();

        if(appStatus == status.Success)
        {
            // Proceed with intended work
        }

        else
        {
            // Pop-up error occurred
        }
    }

}

【问题讨论】:

  • 您是否重新抛出捕获的错误?如果没有,你还期待什么? :)
  • 在表单构造函数中,交换InitializeComponentInterimProceedings的调用顺序。

标签: c# multithreading backgroundworker desktop-application


【解决方案1】:

e.Error 具有从 DoWork 引发的异常。如果你在 DoWork 中使用 try/catch,也不例外。

【讨论】:

  • 但是如果我没有捕捉到异常,它会冻结我的 UI 并且永远不会调用 mre.Set()
  • 你可以使用try/finally。
  • mre.Set in finally 块?!
  • @Sadiq 您不必等待,但 await(异步等待)。这意味着不阻止用户界面。了解asynchronous programming
  • 我实际上已经在your other question中展示了这段代码的异步实现。
猜你喜欢
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多