繁体   English   中英

Task.WhenAll内部的Task的错误处理

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM