2015-04-23 2 views
0

Когда я помещаю блок catch try во время выполнения задачи. В методе RunWorkerCompleted() использование e.error должно быть нулевым. Когда я удаляю блок catch try, а затем в методе RunWorkerCompleted() e.error не равен нулю.В BackgroundWorker: RunWorkerCompleted's 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. Если вы используете try/catch внутри DoWork, исключений нет.

+0

Но если я не поймаю исключение, он замораживает мой интерфейс и никогда не вызывает mre.Set() – Sadiq

+0

Вы можете использовать try/finally. – JeffRSon

+0

Безрезультатно. Все еще не называть mre.Set() – Sadiq