2

I have a WPF window with a BackgroundWorker. I get an exception in Send() method here:

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
     smtpClient.Send(mail);
}

which in turn is invoked in a Click Event for some button like this:

private async void SendClickAsync(object sender, RoutedEventArgs e)
{
    using (MessageServiceClient client = new MessageServiceClient())
    {
        try
        {
            [...]
            worker.RunWorkerAsync();

        }
        catch (Exception ex)
        {
            MessageBox.Show("Error! Check your sender data!", "!", MessageBoxButton.OK, MessageBoxImage.Error);
            [...]
        }
    }
}

Why does this exception doesn't get handled? When I was doing it not asynchronously (everything was in SendClickAsync() method) the message box popped up nicely.

4

3 回答 3

12

当您调用worker.RunWorkerAsync()方法时,您的主线程继续执行并退出 try..catch 块。要处理异常,请使用RunWorkerCompleted事件处理程序。RunWorkerCompletedEventArgs争论具有Error将包含异常对象的属性:

void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
    {
       MessageBox.Show("Error", "!", MessageBoxButton.OK, MessageBoxImage.Error);
       return;
    }
}
于 2012-12-08T21:48:50.953 回答
3

正在使用BackgroundWorker线程池线程,因此它不希望您的代码能够在工作线程上做一些奇怪的事情。这就是为什么BackgroundWorker吞下您在 期间发生的异常DoWork并让您知道它发生在RunWorkerCompletedEventArgs.Error.

于 2012-12-08T21:50:58.780 回答
2

未处理异常的原因是因为它是在不同的线程上引发的。调用worker.RunWorkerAsync();不会阻塞,而是在线程池上启动作业并立即在主线程中返回控制 - 这是异步执行它的全部要点。

但这也意味着在worker.RunWorkerAsync()对主线程的调用退出您的 try-catch 块后,异常不会得到处理(在您的主线程上)。

于 2012-12-08T21:54:34.707 回答