2015-04-23 33 views
0

当我把try catch块放到我的时间任务中。在RunWorkerCompleted()方法中,e.error使用为null。当我删除try catch块然后在RunWorkerCompleted()方法e.error不等于null。在BackgroundWorker中: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 
     } 
    } 

}

+0

你重新抛出被发现的错误吗?如果不是,你还期望什么? :) –

+0

在窗体构造函数中,交换'InitializeComponent'和'InterimProceedings'的调用顺序。 –

回答

2

e.Error具有从DoWork的抛出的异常。如果您在DoWork中使用try/catch,则没有例外。

+0

但是,如果我不捕捉异常,它冻结了我的用户界面,并从来没有调用mre.Set() – Sadiq

+0

你可以使用try/finally。 – JeffRSon

+0

无效。仍然不叫mre.Set() – Sadiq

相关问题