gpt4 book ai didi

c# - BackgroundWorker 异常处理

转载 作者:可可西里 更新时间:2023-11-01 09:11:09 25 4
gpt4 key购买 nike

我正在使用以下组件:

  • 一个库(抛出异常)
  • 用于测试我的日志记录的测试控制台
  • 企业图书馆异常处理应用程序 block
  • 企业图书馆日志应用程序 block

我正在使用后台工作程序调用库方法。该库抛出异常,但从未调用 RunWorkerCompleted 处理程序。

捕获异常的唯一方法是用 try/catch block 包围我的 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 输出绝对不写入任何内容(仅默认输出)。

那么问题出在哪里呢?

//编辑:此代码段用于捕获库的异常。

static void w_DoWork(object sender, DoWorkEventArgs e)
{
try
{
MyClass m = new MyClass();
w.result = m.Compute();
}catch(Exception e){ }

}

最佳答案

这是 BackgroundWorker 的正确模式。

我怀疑问题是您的 Main 方法在 BW 完成之前退出。

RunWorkerAsync 将立即返回,如果您没有在 Main 中等待,那么您的进程将结束,甚至可能在 BW 开始之前结束,更不用说完成了。

尝试在 Main 方法的末尾添加一个 Console.ReadLine


出于兴趣:

BW 在控制台应用程序和 Windows 应用程序中的行为不同。如果您使用 WinForms 或 WPF 应用程序,您的 UI 线程上将有一个派生的 SynchronizationContext,BW 会将 RunWorkerCompleted 编码回 UI 线程并在那里运行它。这是 BW 的主要优势之一。

在控制台应用程序中,使用默认的 SynchronizationContext 并将 RunWorkerCompleted 编码到线程池线程中。这意味着您可以阻止 Main 线程,完成的处理程序仍将运行。

关于c# - BackgroundWorker 异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10299546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com