gpt4 book ai didi

c# - 在 Task.WaitAll 中处理取消的任务和任务异常?

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:51 26 4
gpt4 key购买 nike

我正在使用 TPL 来抓取一组 Urls,然后进行一些处理。

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 中添加重试逻辑。执行此操作的正确方法是什么?

最佳答案

您可以使用 for 循环轻松地围绕 GetStringAsync 进行重试,该循环会尝试直到没有异常或达到重试限制。我存储任务并使用 await 从中提取结果,因此如果没有成功达到重试限制,将重新抛出异常:

async Task<string> GetStringAsync(HttpClient client,string url, int retries)
{
Task<string> task = null;
for (int i = 0; i < retries; i++)
{
try
{
task = client.GetStringAsync(url);
await task;
break;
}
catch
{
// log
}
}

return await task;
}

您甚至可以将其作为 HttpClient 的扩展方法:

static async Task<string> GetStringAsync(this HttpClient client, string url, int retries);

关于c# - 在 Task.WaitAll 中处理取消的任务和任务异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26309162/

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