gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:31:06 24 4
gpt4 key购买 nike

我有一个创建多个基于 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 而不允许我检查任务状态。当在异常处理程序中我不再有任何方法重试失败的任务。

最佳答案

我相信在任务重试会更容易,然后用 Task.WhenAll 替换 Task.WhenAny-in-a-loop 反模式

例如,使用 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);

关于c# - 如何使用 Task.WhenAny 并实现重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43763982/

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