如何处理从BackgroundWorker的DoWork处理程序抛出的异常?

时间:2012-05-04 17:01:27

标签: c# exception backgroundworker

我想处理DoWork处理程序中RunWorkerCompleted处理程序内部发生的异常,但是当代码在调试器下运行时,我首先得到另一个异常“Exeption未被用户代码处理”。< / p>

这里是我正在使用的代码的简短示例:

BackgroundWorker _worker;
public void Test()
{
    _worker = new BackgroundWorker();
    _worker.WorkerReportsProgress = false;
    _worker.WorkerSupportsCancellation = false;

    _worker.DoWork += new DoWorkEventHandler(bw_DoWork);
    _worker.RunWorkerCompleted += new
        RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
    _worker.RunWorkerAsync();
}

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    e.Result = ActuallWorkHere();
}

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    var t = e.Error;
}

private IEnumerable<string> ActuallWorkHere()
{
    throw new Exception("test");
    // "Exeption was unhandled by user code" if called
    string[] res = { "test" };
    return res;
}

我做错了什么?

1 个答案:

答案 0 :(得分:4)

您实际上并没有做错任何事情,这是Visual Studio在调试器中运行代码时处理未处理错误的原因:

来自MSDN上的BackgroundWorker.DoWork Event

  

如果您在Visual Studio调试器下运行,调试器将会   在未处理的DoWork事件处理程序中断点   提出异常。

尝试运行已编译的程序,您将看不到这一点。

请注意,您可以在DoWork中处理此异常,并且RunWorkerCompleted处理程序中的RunWorkerCompletedEventArgs.Error属性仍会存储错误的详细信息。