c# – BackgroundWorker异常处理
我正在使用以下组件:
>一个库(引发异常) 我正在使用backgroundworker调用库方法.库抛出异常,但RunWorkerCompleted处理程序从不被调用. 捕获异常的唯一方法是使用try / catch块来包围我的DoWork处理程序代码. 是否误会了RunWorkerCompletedEventArgs.Error属性?是不是得到了BackgroundWorker被抓到的异常? Codesample: static BackgroundWorker w = new BackgroundWorker(); w.DoWork += new DoWorkEventHandler(w_DoWork); w.RunWorkerCompleted += new RunWorkerCompletedEventHandler(w_RunWorkerCompleted); w.RunWorkerAsync(); static void w_DoWork(object sender,DoWorkEventArgs e) { MyClass m = new MyClass(); w.result = m.Compute(); } static void w_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e) { if (e.Error != null) { HandleException(e.Error); } /* result related code */ } static void HandleException(Exception e) { ExceptionPolicy.HandleException(e,"MyPolicy"); } 上述示例导致我的控制台应用程序的终止. vs2010输出绝对没有写(仅默认输出). 那么问题在哪里? //编辑:此代码段用于捕获库的异常. static void w_DoWork(object sender,DoWorkEventArgs e) { try { MyClass m = new MyClass(); w.result = m.Compute(); }catch(Exception e){ } } 解决方法
这是BackgroundWorker的正确模式.
我怀疑问题是您的主方法是在BW完成之前退出的. RunWorkerAsync将立即返回,如果您不在Main中等待,那么您的进程即将结束,甚至在BW开始之前也不会完成. 尝试在主方法的末尾添加一个Console.ReadLine. 不感兴趣: 控制台应用程序和Windows应用程序中BW的行为不同.如果您使用WinForms或WPF应用程序,您的UI线程上将会派生一个派生的SynchronizationContext,而BW会将RunWorkerCompleted组织回UI线程并在其中运行.这是BW的主要好处之一. 在控制台应用程序中,使用默认的SynchronizationContext,并将RunWorkerCompleted编组到线程池线程上.这意味着您可以阻止主线程,并且完成的处理程序仍将运行. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |