gpt4 book ai didi

c# - BackgroundWorker 中未处理的异常

转载 作者:IT王子 更新时间:2023-10-29 03:43:20 26 4
gpt4 key购买 nike

我有一个小型 WinForms 应用程序,它利用 BackgroundWorker 对象执行长时间运行的操作。

后台操作偶尔会抛出异常,通常是当有人打开了一个正在重新创建的文件时。

无论代码是否从 IDE 运行,.NET 都会弹出一个错误对话框,通知用户发生了未处理的异常。使用 Release 配置编译代码也不会改变这一点。

根据 MSDN :

If the operation raises an exception that your code does not handle, the BackgroundWorker catches the exception and passes it into the RunWorkerCompleted event handler, where it is exposed as the Error property of System.ComponentModel..::.RunWorkerCompletedEventArgs. If you are running under the Visual Studio debugger, the debugger will break at the point in the DoWork event handler where the unhandled exception was raised.

我希望偶尔会抛出这些异常,并希望在 RunWorkerCompleted 事件中而不是在 DoWork 中处理它们。我的代码工作正常,错误在 RunWorkerCompleted 事件中得到了正确处理,但我终生无法弄清楚如何停止提示“未处理的异常”发生的 .NET 错误对话框。

BackgroundWorker 不是应该自动捕获该错误吗? MSDN 文档不是这么说的吗?我需要做什么来通知 .NET 此错误正在处理,同时仍允许异常传播到 RunWorkerCompletedEventArgs 的 Error 属性中?

最佳答案

您所描述的不是 BackgroundWorker 的定义行为。我怀疑你做错了什么。

这里有一个小示例,证明 BackgroundWorker 在 DoWork 中吃掉异常,并在 RunWorkerCompleted 中提供给您:

var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
throw new InvalidOperationException("oh shiznit!");
};
worker.RunWorkerCompleted += (sender, e) =>
{
if(e.Error != null)
{
MessageBox.Show("There was an error! " + e.Error.ToString());
}
};
worker.RunWorkerAsync();

我的通灵调试技巧正在向我揭示您的问题:您正在 RunWorkerCompleted 处理程序中访问 e.Result——如果出现 e.Error,您必须在不访问 e.Result 的情况下处理它。比如下面的代码,不好不好,会在运行时抛出异常:

var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
throw new InvalidOperationException("oh shiznit!");
};
worker.RunWorkerCompleted += (sender, e) =>
{
// OH NOOOOOOOES! Runtime exception, you can't access e.Result if there's an
// error. You can check for errors using e.Error.
var result = e.Result;
};
worker.RunWorkerAsync();

这是 RunWorkerCompleted 事件处理程序的正确实现:

private void RunWorkerCompletedHandler(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
{
DoSomethingWith(e.Result); // Access e.Result only if no error occurred.
}
}

瞧,您不会收到运行时异常。

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

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