我正在玩一段时间后写的一段代码。这段代码以异步方式处理一些请求。
var client = new HttpClient();
var searchPromises = searchTerms
.Select(GetSearchUrl)
.Select(client.GetStringAsync);
var searchPages = await Task.WhenAll(searchPromises);
我将创建一个新的
HttpClient
。使用一些搜索条件术语,我编写了搜索引擎网址。然后,我将这些URL用作输入,以获取代表带有结果页面的异步请求的任务。最后,我等待使用Task.WhenAll
将它们组合在一起的响应。问题是,如果这些请求中只有一个得到404、500或类似的代码,我的代码就会抛出
AggregateException
。有没有一种方法可以指定在其中一个线程发生错误的情况下应该发生什么,以便从其他所有结果中获得结果?
我已经看过ContinueWith,但是它似乎不符合要求,也就是说,它不知道如何处理所有错误,只是不知道如何处理所有错误。
最佳答案
发生了什么事,我创建了一个新的HttpClient。使用一些搜索条件术语,我编写了搜索引擎网址。然后,我将这些URL用作输入,以获取代表带有结果页面的异步请求的任务。最后,我使用Task.WhenAll将这些响应分组在一起。
有没有一种方法可以指定在其中一个线程发生错误的情况下应该发生什么,以便从其他所有结果中获得结果?
IMO,最简单的解决方案是更改您对问题的看法。现在,您正在考虑“在每个URL上执行下载”,然后“让它们全部完成并逐项处理错误”。只需更改您的操作(“下载”)以包括您希望每个项目执行的任何操作。换句话说,您想要做的是“执行每个URL的下载并处理错误”,然后“等待它们全部完成”:
var client = new HttpClient();
var searchPromises = searchTerms
.Select(GetSearchUrl)
.Select(url => DownloadAsync(client, url));
var searchPages = await Task.WhenAll(searchPromises);
var successfulSearchPages = searchPages.Where(x => x != null);
...
private static async Task<string> DownloadAsync(HttpClient client, string url)
{
try
{
return await client.GetStringAsync(url);
}
catch (HttpRequestException ex)
{
// TODO: Perform appropriate error handling
return null;
}
}
关于c# - 处理WhenAll时,可以优雅地处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28983363/