小编Mic*_*l K的帖子

如何运行多个任务,处理异常并仍然返回结果

我正在更新我的并发技能.我的问题似乎相当普遍:从多个Uris读取,解析并使用结果等.我在C#Cookbook中使用了Concurrency.有一些使用GetStringAsync的例子,例如

static async Task<string> DownloadAllAsync(IEnumerable<string> urls)
{
    var httpClient = new HttpClient();

    var downloads = urls.Select(url => httpClient.GetStringAsync(url));

    Task<string>[] downloadTasks = downloads.ToArray();

    string[] htmlPages = await Task.WhenAll(downloadTasks);

    return string.Concat(htmlPages);
}
Run Code Online (Sandbox Code Playgroud)

我需要的是用于运行多个异步任务的异步模式,捕获全部或部分成功.

  1. 网址1成功
  2. 网址2成功
  3. Url 3失败(超时,坏Uri格式,401等)
  4. 网址4成功
  5. ... 20多个成功的混合

如果任何失败,等待DownloadAllAsync任务将抛出单个聚合异常,从而丢弃累积的结果.从我的有限研究来看,WhenAll或WaitAll表现相同.我想捕获异常,记录失败,但继续执行剩余的任务,即使它们都失败了.我可以一个接一个地处理它们,但这不会破坏允许TPL管理整个过程的目的吗?是否有一个链接到一个模式,以纯TPL方式实现这一点?也许我使用的是错误的工具?

c# task-parallel-library

14
推荐指数
1
解决办法
5283
查看次数

标签 统计

c# ×1

task-parallel-library ×1