【发布时间】:2012-05-05 04:28:12
【问题描述】:
我正在使用以下组件:
- 一个库(引发异常)
- 一个测试控制台来测试我的日志记录
- 企业库异常处理应用程序块
- 企业库日志记录应用程序块
我正在使用后台工作程序调用库方法。库引发异常,但从未调用 RunWorkerCompleted 处理程序。
捕获异常的唯一方法是用 try/catch 块包围我的 DoWork 处理程序代码。
是否误解了 RunWorkerCompletedEventArgs.Error 属性?不是为了获取被BackgroundWorker捕获的异常吗?
代码示例:
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 输出绝对不写任何东西(只有默认输出)。
那么问题出在哪里?
//编辑:这个 sn-p 用于捕获库的异常。
static void w_DoWork(object sender, DoWorkEventArgs e)
{
try
{
MyClass m = new MyClass();
w.result = m.Compute();
}catch(Exception e){ }
}
【问题讨论】:
-
你在主线程上有什么东西阻止它结束吗?有点像一段时间(真的)?
-
您是否 100% 确定 RunWorkerCompleted 永远不会被调用?这是一个证明这应该有效的问题...stackoverflow.com/questions/1044460/…
-
你不能调试看看会发生什么? HandleException() 返回什么?
-
我没有一段时间是真的或类似的东西。只是一个 Main(string[] args) 和 bw 的静态处理程序。是的,永远不会调用 RunWorkerCompleted。调试器既不会在那里停止,也不会在处理程序开始时执行任何操作(File.Create、Debug.WriteLine 等)。
-
@Reniuz - 我确定我记得 C# IDE 有断点! w_RunWorkerCompleted 第一行的排水沟中的红色斑点非常有用。
标签: c# multithreading exception backgroundworker enterprise-library