BackgroundWorker 中未处理的异常

2023-11-22

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

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

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

根据MSDN:

如果操作引发代码无法处理的异常,BackgroundWorker 会捕获该异常并将其传递到 RunWorkerCompleted 事件处理程序中,在该处理程序中该异常将作为 System.ComponentModel..::.RunWorkerCompletedEventArgs 的 Error 属性公开。如果您在 Visual Studio 调试器下运行,则调试器将在 DoWork 事件处理程序中引发未处理异常的位置处中断。

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

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


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

这是一个小示例,证明了BackgroundWorker在以下情况下会发生异常:DoWork,并让您可以使用它们运行工作完成:

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.
    }
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BackgroundWorker 中未处理的异常 的相关文章

  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • 在 C++ 中使用 matlab 结构(matlab 函数调用的返回值)(由 matlab 编译器生成的库)

    你好 我有一个相当简单的 matlab 函数 例如 function MYSTRUCT myfunc MYSTRUCT prop1 test MYSTRUCT prop2 foo MYSTRUCT prop3 42 end 我用 matla
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没

随机推荐

  • Java:如何原子地替换映射中的所有值?

    我在多线程环境中有一个有状态 bean 它将其状态保存在映射中 现在我需要一种方法来在一个原子操作中替换该映射的所有值 public final class StatefulBean private final Map
  • WinAPI 和 UTF-8 支持

    关于 UTF 8 支持和各种 Win32 API 的快速问题 在典型的C MFC项目中 MessageBox 是否可以显示UTF 8编码的字符串 谢谢 安德鲁 快速回答 不 更长的答案 如果字符串仅包含常规 ANSI 字符 例如美国英语 则
  • MS Access 中多值字段的替代方案

    相关问题 多值字段是个好主意吗 我知道多值字段类似于多对多关系 在 MS Access 应用程序中替换多值字段的最佳方法是什么 我有一个具有多值字段的应用程序 我不确定如何消除这些并以单值字段的形式实现完全相同的逻辑 当我想将多值关系转变为
  • 在 java.util.logginglogging.properties 文件中,“handlers”和“.handlers”之间有什么区别?

    在LogManager的文档中 Handlers属性的设置如下 财产 处理者 这定义了空格或逗号分隔 要加载和注册的处理程序类的类名列表 根 Logger 上的处理程序 名为 的 Logger 属性 handlers 这定义了一个空格或逗号
  • 从 SqlDependency 获取数据

    我有一个表和一个正在等待新插入的 SqlDependency OnChange 根据我的需要触发 但我不明白是否可以获得导致数据库更改的行 SqlDependency sql命令 SqlCommand cmd new SqlCommand
  • 我的 ASP.NET App_code 更改没有被拾取(或被缓存??)

    帮助 我在 根级别 App Code 目录下有一个 cs 文件 用于检索所请求 URL 的正确模板 它链接到我们自己的内容管理数据库 最初 它工作正常 我可以对其进行更改 并且 Web 应用程序可以正常接收它们 然后发生了一些事情 不知道是
  • 无法使用 MPMoviePlayerController 从视频中获取多个图像。操作系统状态-12433

    我正在尝试使用 MPMoviePlayerController 从选定的视频文件中提取多个图像 下面是我写的代码 movie MPMoviePlayerController alloc initWithContentURL info obj
  • “dlsym”的库在哪里

    我收到此链接器错误 system core libacc tests main cpp 42 error undefined reference to dlsym 你能告诉我 ubuntu 9 10 上包含 dlsym 库的库在哪里吗 谢谢
  • CUDA PTX 代码和寄存器内存的混淆

    当我尝试管理内核资源时 我决定研究一下 PTX 但有一些事情我不明白 这是我编写的一个非常简单的内核 global void foo float out float in uint32 t n uint32 t idx blockIdx x
  • 控制 $expand 请求返回的内容

    所以 使用ODataController 如果有人这样做 你可以控制返回的内容 odata Foos 42 Bars 因为您会被叫到FoosController像这样 public IQueryable
  • 将 java.lang.reflect.Method 转换为函数式接口

    很难找到该主题的任何线索 我能找到的只是有关将一个函数接口转换为另一个函数接口的问题以及一些有关 Java 类型转换的文章 不是我要找的 This问题是关于转换lambda Method我想要相反的 转换Method任何功能接口 例如Con
  • 如何禁用 Maven 阻止外部 HTTP 存储库?

    自版本 3 8 1 起 Maven 默认阻止外部 HTTP 存储库 请参阅https maven apache org docs 3 8 1 release notes html 有没有办法禁用它或使存储库免受此规则的约束 我找到了一个解决
  • 如何将tensorflow 2.0估计器模型转换为tensorflow lite?

    我下面的以下代码生成常规张量流模型 但是当我尝试将其转换为张量流精简版时 它不起作用 我遵循了以下文档 https www tensorflow org tutorials estimator linear1https www tensor
  • addGlobalMonitorForEventsMatchingMask 不起作用

    我在获取辅助应用程序 开发案例中的 XCode 来捕获全局 keyDown 事件时遇到问题 我见过很多类似下面的代码示例 但这对我来说在 10 9 4 上不起作用 import
  • 如何将整个图像作为壁纸适合屏幕上

    我正在开发一个应用程序 它从图库中选择一张图像 然后将该图像设置为壁纸 但这里的问题是 只有部分图像设置为壁纸而不是整个图像 但我想将整个图像设置为壁纸 你能告诉我该怎么做吗 这是我的代码 public class Scaleimage e
  • C++11 thread_local 变量自动静态吗?

    这两个代码段有区别吗 void f thread local vector
  • 使用 if 语句设置 javascript 变量 - 'var = x' 应该在 IF 内部还是外部?

    这可能是一个基本问题 但我很难找到答案 您想根据 var A 设置 var B 你会怎么做 var B if A red hot else cool 我认为这行不通 我想你可以做 if A red var B hot else var B
  • 四舍五入双打 - .5 - sprintf

    我使用以下代码四舍五入到 2dp sprintf temp 2f coef i coef i returns a double 成功将 6 666 舍入为 6 67 但舍入时无法正常工作 5 555 它返回 5 55 而它应该 至少在我看来
  • 是否有必要将动态数组的容量加倍?

    当在 C 中创建自动扩展数组 如 C 的 std vector 时 通常 或者至少是常见的建议 在每次填充时将数组的大小加倍 以限制调用的数量realloc为了尽可能避免复制整个数组 例如 我们首先为 8 个元素分配空间 插入 8 个元素
  • BackgroundWorker 中未处理的异常

    我有一个小型 WinForms 应用程序 它利用 BackgroundWorker 对象来执行长时间运行的操作 后台操作偶尔会引发异常 通常是当有人打开正在重新创建的文件时 无论代码是否从 IDE 运行 NET 都会弹出一个错误对话框 通知