使用长时间运行的后台消费者任务时 Task.Factory.StartNew 中的静默异常?

2023-12-23

这通知未处理的异常:

new Thread(_ => { throw new Exception(); }).Start();

这不会(至少在您等待/检索结果之前):

Task.Factory.StartNew(() =>
        {
            throw new Exception();
        });

为什么?抛出异常的线程发生了什么?它会死吗?

这是一个问题,您运行任务但不需要其结果,或者需要等待它,如下所示:

_operationQueue = new BlockingCollection<Operation>();

Task.Factory.StartNew(() => 
{
     foreach (var item in _operationQueue.GetConsumingEnumerable())
     {
         // do something that throws
     }
}, TaskCreationOptions.LongRunning);

在这种情况下,是什么状态_operationQueue留在?

我知道我可以使用带有 TaskContinuationOptions.OnlyOnFaulted 的 Continuation,您可以恢复处理吗?


那么,您认为应该发生什么?您是否认为每当另一个线程中抛出异常时,它应该立即传播到启动该任务的线程?我strongly不同意。首先,调用线程中的代码将被迫中止它正在执行的操作,这很可能会导致严重的问题。只需查看周围的所有帖子即可Thread.Abort查看当您允许在程序执行中的任意点而不是在某些已知点抛出异常时出现的所有非常重要的问题。

如果您建议当任务的代码抛出异常时整个程序应该崩溃,那么我会说总的来说这是不可取的。在极少数情况下,您可以(相当容易地)创建任务的延续,如果任务出现故障,该延续会结束整个流程。不过,我还不需要自己创建这样的延续。如果系统被设计为在任务抛出异常时关闭进程,那么获得相反的行为就不会那么容易了。

抛出异常的线程发生了什么?它会死吗?

如果捕获到异常,则捕获后继续执行;如果它传播到整个调用堆栈,那么异常将被内部的代码捕获Task包装异常并使其可用于延续的框架。

在这种情况下,_operationQueue 处于什么状态?

这是一个非常好的队列,已从中删除了 1..N 个项目。如果循环体总是抛出异常,那么将从循环体中取出一项。如果它只是偶尔抛出,那么将会从中取出一些物品。剩余的项目仍在队列中,并且可以由有权访问它的任何其他线程删除。如果队列不再可访问,那么它将有资格进行垃圾回收。

我知道我可以使用带有 TaskContinuationOptions.OnlyOnFaulted 的 Continuation,您可以恢复处理吗?

调用线程可以;当然。任务本身只能通过有一个try/catch在它的代表内。如果异常已引发到任务发生故障的程度,则任何任务都不会允许该任务继续执行。

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

使用长时间运行的后台消费者任务时 Task.Factory.StartNew 中的静默异常? 的相关文章

  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 模板类的模板构造函数的 C++ 显式模板特化

    我有一个像这样的课程 template
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 从共享网络文件夹运行的 .NET 应用程序的性能损失

    从共享网络文件夹运行 NET 4 0 应用程序是否有任何性能损失 我发现哪个应用程序启动速度较慢 但 在使用时没有注意到任何变慢 但不确定 当通过网络运行可执行文件时 Windows 不会在应用程序启动时通过网络传输整个应用程序 这样做是为
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c

随机推荐