2015-04-23 28 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

相關問題