c# - 处理WhenAll时,可以优雅地处理异常

标签 c# async-await

我正在玩一段时间后写的一段代码。这段代码以异步方式处理一些请求。

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/

相关文章:

c# - 我将 Azure 与多个 Web 角色和 1 个缓存服务器一起使用。当我更改对象的属性时,缓存的对象是否会在缓存服务器中自动更新

javascript - 每个异步调用的特定任务并 promise 等待所有

c# - 比手动字典更好的选项来引用其中正在运行的方法的 'current task'?

c# - ApplicationInsights TelemetryClient 在调试时初始化很慢

C# - 在参数中声明方法(委托(delegate))

javascript - 如何在 Typescript 中生成 * 数组

javascript - 如何通过另一个异步函数内的异步函数循环遍历数组?

javascript - 异步存储返回函数而不是值

c# - SQLite 插入带参数的字符串数据导致无效强制转换异常

c# - 我如何从 ASP.NET 站点访问智能卡?