Task.WhenAll等待所有任务完成,适合批量操作;Task.WhenAny响应首个完成的任务,适用于超时或降级场景。两者不启动任务,需先并行创建任务再传入,注意异常处理与并发控制。

Task.WhenAll 和 Task.WhenAny 是 C# 中协调多个异步任务的核心工具,它们不执行任务,而是“观察”任务的完成状态,帮你决定下一步怎么走。
当你需要所有异步操作都成功完成(比如批量获取用户数据、并行上传多个文件),就用 WhenAll。它返回一个新任务,这个任务在所有输入任务都完成后才完成;如果任一任务出错或被取消,它会立刻失败,并抛出包含所有异常的 AggregateException。
IEnumerable<task></task> 或 Task[],返回 Task;传入 Task<t>[]</t>,返回 Task<t></t>
try/catch 捕获 AggregateException,再遍历 InnerExceptions 分析具体失败项适合“抢答”场景,比如设置超时、从多个服务中取最快响应、或实现降级逻辑。它返回一个 Task<task></task>,里面包裹最先完成的那个原始任务(无论成功、失败还是取消)。
CancellationTokenSource.Cancel() 或保留引用后续处理Task.Delay() 实现超时控制,例如:await Task.WhenAny(apiCall, Task.Delay(3000)) == apiCall ? ... : "超时"
WhenAll 和 WhenAny 本身不启动任务——你得先调用异步方法(如 GetDataAsync())拿到 Task 对象,再把它们传进去。常见错误是写成 WhenAll(GetDataAsync(), GetDataAsync()),这其实是同步调用两次,不是并行发起。
WhenAll
var tasks = urls.Select(u => HttpClient.GetAsync(u)); await Task.WhenAll(tasks);
SemaphoreSlim 或 Parallel.ForEachAsync(.NET 6+)问自己一个问题:“我关心的是所有结果,还是第一个结果?”
WhenAll
WhenAny
WhenAny 控制整体超时,内部用 WhenAll 并行拉取子数据基本上就这些。用对了,异步代码既清晰又健壮。
以上就是C# Task.WhenAll和Task.WhenAny - 高效管理多个并行任务的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号