【发布时间】:2014-10-10 22:53:24
【问题描述】:
我正在使用 TPL 抓取一组 Url,然后进行一些处理。
for (int i = 0; i < list.Count; i++)
{
var tuple = list[i];
string url = tuple.Item2;
tasks[i] = httpClient.GetStringAsync(url).
ContinueWith(task => {
{
......
});
}
Task.WaitAll(tasks);
问题在于,在Task.WaitAll 语句中,它似乎经常会抛出异常,因为任务已被取消。我知道httpClient.GetStringAsync 可能并不总是确保成功,所以我想在发生异常时在httpClient.GetStringAsync 中添加重试逻辑。这样做的正确方法是什么?
【问题讨论】:
-
如果重试失败,还想要异常吗?
-
@I3arnon:我愿意。但随后异常将作为 AggregateException 传递给 Task.WaitAll。对吗?
-
是的,因为一个任务可能包含多个异常。如果你想要为
async-await构建的await Task.WhenAll,那么你会在里面得到实际的异常(第一个是)。 -
@I3arnon:问题是我在 Main() 中使用了这个函数,所以我不能使用 await Task.WhenAll..
-
如果这很关键,您可以使用
Task.WhenAll(...).GetAwaiter().GetResult()。
标签: c# asynchronous task-parallel-library async-await dotnet-httpclient