如何使用Task.WhenAny并实现重试

2024-05-13

我有一个创建多个基于 I/O 的任务的解决方案,我正在使用Task.WhenAny()来管理这些任务。但通常许多任务会由于网络问题或请求限制等原因而失败。

我似乎找不到一个解决方案,使我能够在使用时成功重试失败的任务Task.WhenAny()方法。

这是我正在做的事情:

var tasks = new List<Task<MyType>>();
foreach(var item in someCollection)
{
   task.Add(GetSomethingAsync());
}
while (tasks.Count > 0)
{
   var child = await Task.WhenAny(tasks);
   tasks.Remove(child);
   ???
}
    

因此,上述结构适用于完成任务,但我还没有找到处理和重试失败任务的方法。这await Task.WhenAny抛出一个AggregateException而不是让我检查任务状态。当在异常处理程序中时,我不再有任何方法来重试失败的任务。


我相信重试会更容易within任务,然后替换Task.WhenAny循环反模式Task.WhenAll

例如,使用Polly https://github.com/App-vNext/Polly:

var tasks = new List<Task<MyType>>();
var policy = ...; // See Polly documentation
foreach(var item in someCollection)
  tasks.Add(policy.ExecuteAsync(() => GetSomethingAsync()));
await Task.WhenAll(tasks);

或者,更简洁地说:

var policy = ...; // See Polly documentation
var tasks = someCollection.Select(item => policy.ExecuteAsync(() => GetSomethingAsync()));
await Task.WhenAll(tasks);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Task.WhenAny并实现重试 的相关文章

随机推荐

  • 具有 Angular 前端的简单 Django Rest Framework 应用程序会发生什么?

    我学习 Django 一段时间了 我发现这张图片很有帮助 我现在正在深入研究 Angular JS 我试图弄清楚每个组件 指令 控制器和服务 如何交互以及是否存在类似的 循环 这blog http kirkbushell me when t
  • Azure SQL 第一个查询速度慢

    我们遇到针对索引的第一次执行查询非常慢的情况 就像索引冷启动一样 该表很大 有数百万行 执行 30 秒 执行时间 4ms 数据库脚本 CREATE TABLE Audits Id int NOT NULL IDENTITY Timestam
  • 线程安全的get(访问器方法)

    我目前正在使用以下代码对变量进行线程安全访问 int gnVariable void getVariableValue int pnValue acquireLock Acquires the protection mechanism pn
  • MikeOS 引导加载程序中的堆栈段

    我不明白这段代码 mov ax 07C0h Set up 4K of stack space above buffer add ax 544 8k buffer 512 paragraphs 32 paragraphs loader cli
  • 如何使用 jquery imgAreaSelect 用 php 裁剪图像?

    我正在使用以下 javascript 代码来实例化 jquery图像区域选择 http odyniec net projects imgareaselect 裁剪我的图像 document ready function ladybug im
  • 单击文件下载后,成功后使用 AJAX 重定向到另一个页面

    In my WordPress project my Download button containing a zip file which onClick should be downloaded So the HTML producin
  • 如何捕获正在播放的音频?

    有谁知道如何以编程方式捕获正在播放的声音 即来自声卡的所有声音 而不是麦克风等输入设备 假设您正在谈论 Windows 则基本上可以通过三种方法来实现此目的 首先是打开音频设备的主输出作为录音源 这只有在驱动程序支持时才可能实现 尽管现在大
  • 带圆角边框的 Div

    我不明白获得 div 的更大圆角底部边框的公式 以及是否有更简单的方法在 Bootstrap 中实现它 现在是这样的 以及我想如何开发它 header background color blue height 40px width 90px
  • mysql计算唯一行值

    TABLE quotation id clientid 1 25 2 25 3 25 4 25 5 26 如何查询有多少个不同的客户端TABLE quotation 我不希望重复的条目被计算多次 我需要的答案是2 在 1 行中 因为唯一的非
  • Java:如果数组大小未知,如何初始化?

    我要求用户输入 1 到 100 之间的一些数字并将它们分配到一个数组中 数组大小未初始化 因为它取决于用户输入数字的次数 我应该如何分配数组长度 如果用户输入 5 6 7 8 9 5 个数字 则 int list becomes int l
  • 当字段不为空时创建部分索引

    我正在尝试在字段上创建部分索引 但仅当该字段不为空时 换句话说 我希望能够让许多文档能够存储 null 但对于在字段中实际具有值的文档 我希望该值是唯一的 这是我尝试使用的代码 db account createIndex email 1
  • 根据单元格值隐藏列

    在我的谷歌电子表格 A 中 我使用 TRANSPOSE 和 IMPORTRANGE 公式的组合从日历电子表格 B 导入数据 以便填写事件的工作时间表 因为每个日期都有 3 个事件空位 但这些空位并不总是被填满 所以我收到了很多过时的列 表格
  • VBA 中的 VSTO:AddIn.Object 有时不返回任何内容 (null)

    Given VSTO 插件 An override object RequestComAddInAutomationService 它返回一个名为的类的实例Facade在我的场景中 Excel 2007 中的 VBA 宏可访问AddIn O
  • 如何加速 R for 循环?

    我正在为 R 中 GWmodel 包中的 gwr basic 函数运行以下 for 循环 我需要做的是收集任何给定带宽的估计参数的平均值 代码如下 library GWmodel data DubVoter Dub voter LARent
  • R:为什么 kable 不在 for 循环内打印?

    我正在使用 rmarkdown 和 Latex 编写报告 我需要使用打印一组表格knitr kable 但在 for 循环内时不会打印 这是我的代码 title project title author Mr Author date 201
  • 将 Gitlab CI 阶段配置为不并行运行

    我有一个具有多个阶段的 Gitlab CI 管道 默认情况下 两个作业之间的同一阶段将并行运行 我所经历的阶段之一是集成测试阶段 该阶段一次只能有一个正在运行的实例 因为它依赖于正在设置和拆除的特定资源 有没有一种简单的方法来指定某个阶段应
  • 直接在应用程序中评价 Google Play 应用程序 [重复]

    这个问题在这里已经有答案了 我需要在我的 Android 应用程序中设置费率选项 我找到了这个link http www androidsnippets com prompt engaged users to rate your app i
  • 表单提交后 Django 重定向不起作用

    Django 新手 所以这个可能有一个非常简单的答案 但我一生都找不到具体的解决方案 我只是想在使用 FileField 提交表单后重定向到新的 URL 我可以单独导航到该 URL 效果很好 文件上传正确 因此我知道它已正确验证 但重定向返
  • Swift UINavigationController 子类中的强制 init 覆盖

    我目前正在子类化UINavigationController对于服务视图控制器流的框架 在某种程度上 就像UIImagePickerController do 这是我的实现示例 尽可能简单 可以在操场上运行 import UIKit pub
  • 如何使用Task.WhenAny并实现重试

    我有一个创建多个基于 I O 的任务的解决方案 我正在使用Task WhenAny 来管理这些任务 但通常许多任务会由于网络问题或请求限制等原因而失败 我似乎找不到一个解决方案 使我能够在使用时成功重试失败的任务Task WhenAny 方