我正在更新我的并发技能.我的问题似乎相当普遍:从多个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)
我需要的是用于运行多个异步任务的异步模式,捕获全部或部分成功.
如果任何失败,等待DownloadAllAsync任务将抛出单个聚合异常,从而丢弃累积的结果.从我的有限研究来看,WhenAll或WaitAll表现相同.我想捕获异常,记录失败,但继续执行剩余的任务,即使它们都失败了.我可以一个接一个地处理它们,但这不会破坏允许TPL管理整个过程的目的吗?是否有一个链接到一个模式,以纯TPL方式实现这一点?也许我使用的是错误的工具?