加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – BackgroundWorker异常处理

发布时间:2020-12-15 03:51:36 所属栏目:百科 来源:网络整理
导读:我正在使用以下组件: 一个库(引发异常) 测试控制台来测试我的日志记录 企业库异常处理应用程序块 企业库日志应用程序块 我正在使用backgroundworker调用库方法.库抛出异常,但RunWorkerCompleted处理程序从不被调用. 捕获异常的唯一方法是使用try / catch块
我正在使用以下组件:

>一个库(引发异常)
>测试控制台来测试我的日志记录
>企业库异常处理应用程序块
>企业库日志应用程序块

我正在使用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编组到线程池线程上.这意味着您可以阻止主线程,并且完成的处理程序仍将运行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读