我有一个创建多个基于 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(使用前将#替换为@)