问题:重新使用.NET Backgroundworker,有没有办法让异常正常传回主线程?
背景:
答案 0 :(得分:6)
BackgroundWorker
自动传回异常。当您挂钩RunWorkerCompleted
事件时,它位于AsyncCompletedEventArgs.Error属性中。
如果您愿意,可以在此事件处理程序中包装并重新抛出异常 - 请记住,框架中有一个bug会导致“外部”异常被抛出,因为您处于在Invoke
。
在.NET应用程序中的后台线程上发生的异常是一个灾难性的错误,它可以并且会导致整个过程失败;处理此问题的唯一方法是将所有活动包装在try-catch块中并保存发生的任何异常,这正是BackgroundWorker
所做的。
答案 1 :(得分:2)
如果DoWork调用的异步方法抛出异常,则该异常将对RunWorkerCompleted处理程序可用。你可以在那里处理它。
private void backgroundWorker1_RunWorkerCompleted(
object sender, RunWorkerCompletedEventArgs e)
{
// First, handle the case where an exception was thrown.
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
}
...
}
来自MSDN:
如果在期间引发异常 异步操作,类会 为错误分配例外 属性。客户端应用程序 事件处理程序委托应该检查 访问前的Error属性 类中的任何属性派生自 AsyncCompletedEventArgs;除此以外, 该物业将提出一个 TargetInvocationException及其 InnerException属性持有一个 参考错误。
答案 2 :(得分:1)
不,没有。
相反,您可以创建一个继承BackgroundWorker
并覆盖OnRunWorkerCompleted
的类来检查e.Error
并运行异常处理程序(如果它不是null
。
答案 3 :(得分:0)
您是否尝试过静态Application.ThreadException事件?