[英]Error handling for Tasks inside Task.WhenAll
我正在尝试创建一个网络爬虫,以并行方式查询许多网址,并使用Task.WhenAll()等待它们的响应。 但是,如果任务之一不成功,则WhenAll将失败。 我期望许多任务返回404,并希望处理或忽略这些任务。 例如:
string urls = Enumerable.Range(1, 1000).Select(i => "https://somewebsite.com/" + i));
List<Task<string>> tasks = new List<Task<string>>();
foreach (string url in urls)
{
tasks.Add(Task.Run(() => {
try
{
return (new HttpClient()).GetStringAsync(url);
}
catch (HttpRequestException)
{
return Task.FromResult<string>("");
}
}));
}
var responseStrings = await Task.WhenAll(tasks);
这永远不会碰到catch语句,并且WhenAll在第一个404处失败。如何让WhenAll忽略异常并仅返回成功完成的任务? 更好的是,它可以在下面的代码中的某个地方完成吗?
var tasks = Enumerable.Range(1, 1000).Select(i => (new HttpClient()).GetStringAsync("https://somewebsite.com/" + i))));
var responseStrings = await Task.WhenAll(tasks);
谢谢你的帮助。
您需要使用await
来观察异常:
var tasks = Enumerable.Range(1, 1000).Select(i => TryGetStringAsync("https://somewebsite.com/" + i));
var responseStrings = await Task.WhenAll(tasks);
var validResponses = responseStrings.Where(x => x != null);
private async Task TryGetStringAsync(string url)
{
try
{
return await httpClient.GetStringAsync(url);
}
catch (HttpRequestException)
{
return null;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.