如何从Task.WhenAll执行结果中返回所有未被取消的任务
实现方案
核心逻辑是先等待所有任务执行到结束状态(无论成功、取消、异常),再过滤出符合要求的成功任务提取结果,改造后的代码如下:
var tasks = new List<Task<string>>(); /** 此处省略业务代码 **/ // 等待所有任务执行完毕,吞掉WhenAll抛出的取消/异常信息 await Task.WhenAll(tasks).ContinueWith(static t => { }); // 筛选所有未取消、执行成功的任务结果 var validResults = tasks .Where(task => !task.IsCanceled && task.IsCompletedSuccessfully) .Select(task => task.Result) .ToList();
补充说明
- 如果你需要收集任务抛出的业务异常,可以额外判断
task.IsFaulted属性,从task.Exception中读取异常信息 - 该方案不会干预各任务独立的
CancellationTokenSource逻辑,任务取消仍然互不影响 - 代码中已经通过
Task.WhenAll确认所有任务执行完毕,此时访问task.Result不会造成线程阻塞,也不会触发未完成任务的异常
内容的提问来源于stack exchange,提问作者AmandaSai98b
相关产品推荐
相关产品推荐

