C#中的 Task.WaitAll 与 Task.WhenAll

news/2025/11/5 11:16:55/文章来源:https://www.cnblogs.com/zeoHere/p/19193017

在C#中,Task.WaitAllTask.WhenAll 都是用于等待多个任务完成的方法,但它们在工作方式和使用场景上有重要区别。

1. 基本区别

Task.WaitAll

  • 同步阻塞:阻塞当前线程直到所有任务完成
  • 返回值:void
  • 异常处理:抛出 AggregateException

Task.WhenAll

  • 异步非阻塞:返回一个Task,不会阻塞当前线程
  • 返回值TaskTask<T[]>
  • 异常处理:返回的Task包含异常信息

2. 代码示例

Task.WaitAll 示例

async Task WaitAllExample()
{Task task1 = Task.Delay(1000);Task task2 = Task.Delay(2000);Task task3 = Task.Delay(1500);// 阻塞当前线程,直到所有任务完成Task.WaitAll(task1, task2, task3);Console.WriteLine("所有任务已完成");
}

Task.WhenAll 示例

async Task WhenAllExample()
{Task task1 = Task.Delay(1000);Task task2 = Task.Delay(2000);Task task3 = Task.Delay(1500);// 异步等待,不阻塞当前线程await Task.WhenAll(task1, task2, task3);Console.WriteLine("所有任务已完成");
}

3. 返回值处理

有返回值的任务

async Task<int> GetValue1() => await Task.Run(() => 1);
async Task<int> GetValue2() => await Task.Run(() => 2);
async Task<int> GetValue3() => await Task.Run(() => 3);// 使用 WhenAll 获取所有结果
async Task ProcessWithResults()
{Task<int> task1 = GetValue1();Task<int> task2 = GetValue2();Task<int> task3 = GetValue3();int[] results = await Task.WhenAll(task1, task2, task3);Console.WriteLine($"结果: {string.Join(", ", results)}"); // 输出: 1, 2, 3
}

4. 异常处理差异

Task.WaitAll 异常处理

void WaitAllExceptionHandling()
{Task task1 = Task.Run(() => throw new Exception("错误1"));Task task2 = Task.Run(() => throw new Exception("错误2"));try{Task.WaitAll(task1, task2);}catch (AggregateException ex){foreach (var innerEx in ex.InnerExceptions){Console.WriteLine($"捕获异常: {innerEx.Message}");}}
}

Task.WhenAll 异常处理

async Task WhenAllExceptionHandling()
{Task task1 = Task.Run(() => throw new Exception("错误1"));Task task2 = Task.Run(() => throw new Exception("错误2"));Task allTasks = Task.WhenAll(task1, task2);try{await allTasks;}catch (Exception ex){// 注意:WhenAll 只抛出第一个异常Console.WriteLine($"捕获异常: {ex.Message}");// 如果要获取所有异常,需要检查每个任务if (allTasks.IsFaulted && allTasks.Exception != null){foreach (var innerEx in allTasks.Exception.InnerExceptions){Console.WriteLine($"所有异常: {innerEx.Message}");}}}
}

5. 如何选择使用哪个

使用 Task.WaitAll 的情况

// 在同步方法中需要等待多个任务
void SynchronousMethod()
{// 在控制台应用或后台服务中var tasks = new[]{ProcessDataAsync(),SaveToDatabaseAsync(),SendNotificationAsync()};Task.WaitAll(tasks); // 阻塞直到完成Console.WriteLine("所有处理完成");
}

使用 Task.WhenAll 的情况

// 在异步方法中 - 推荐使用
async Task AsynchronousMethod()
{// 在Web API、UI应用或任何异步上下文中var tasks = new[]{ProcessDataAsync(),SaveToDatabaseAsync(),SendNotificationAsync()};await Task.WhenAll(tasks); // 不阻塞线程Console.WriteLine("所有处理完成");
}

6. 最佳实践建议

推荐使用 Task.WhenAll

public class DataProcessor
{// 好的做法 - 使用 WhenAllpublic async Task ProcessAllDataAsync(){var tasks = new List<Task>();for (int i = 0; i < 10; i++){tasks.Add(ProcessItemAsync(i));}await Task.WhenAll(tasks);}// 避免的做法 - 在异步代码中使用 WaitAllpublic async Task ProcessAllDataBadAsync(){var tasks = new List<Task>();for (int i = 0; i < 10; i++){tasks.Add(ProcessItemAsync(i));}// 可能造成死锁!Task.WaitAll(tasks.ToArray());}private async Task ProcessItemAsync(int item){await Task.Delay(100);// 处理逻辑}
}

7. 性能考虑

async Task PerformanceComparison()
{var stopwatch = Stopwatch.StartNew();// 使用 WhenAll - 更高效Task[] tasks = new Task[100];for (int i = 0; i < 100; i++){tasks[i] = Task.Delay(100);}await Task.WhenAll(tasks);Console.WriteLine($"WhenAll 耗时: {stopwatch.ElapsedMilliseconds}ms");// 重新计时stopwatch.Restart();// 使用 WaitAll - 可能造成线程阻塞tasks = new Task[100];for (int i = 0; i < 100; i++){tasks[i] = Task.Delay(100);}Task.WaitAll(tasks);Console.WriteLine($"WaitAll 耗时: {stopwatch.ElapsedMilliseconds}ms");
}

总结

特性 Task.WaitAll Task.WhenAll
阻塞性 同步阻塞 异步非阻塞
返回值 void Task 或 Task<T[]>
异常处理 AggregateException 通过返回的Task处理
使用场景 同步方法中 异步方法中
死锁风险 较高 较低
性能 可能阻塞线程 更高效

一般建议:在大多数现代C#开发中,特别是在ASP.NET Core、Web API、UI应用等场景下,优先使用 Task.WhenAll,因为它更符合异步编程模式,能避免死锁并提高应用响应性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/956613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月北京继承律师实力榜:十强对比与胜诉率数据全公开

“家里老人刚走,房产证上名字还没换,九个亲戚就围着桌子吵起来。”——这是北京西城赵先生上周在律所前台说的第一句话。继承纠纷往往伴随情绪、时间、金钱三重压力:房产市值高、遗嘱真伪难辨、亲属关系复杂,任何一…

IEEE Transactions 风格补充材料(Word)快捷排版教程

IEEE Transactions 风格补充材料(Word)快捷排版教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

2025年11月北京继承律师评测榜:继承纠纷律师团队权威榜单发布

继承纠纷往往伴随家庭情感裂痕与巨额财产博弈,当事人既要在短时间内厘清法定继承、遗嘱效力、遗赠扶养等复杂关系,又担心诉讼周期过长、证据灭失、执行落空。北京作为高净值人群聚集地,房产价值高、家庭结构多元,继…

Qoj2570. Maximal Subsequence

Qoj2570. Maximal Subsequence ‌题目描述‌ 给定一个包含 \(n\) 个整数的数组 \(a\)。序列的美观度定义为该序列的最长递增子序列的长度。要求找出数组 \(a\) 的一个子序列,使得该子序列的美观度小于整个数组 \(a\) …

VS code中编写和运行C语言

VS code中编写和运行C语言

Ansible常用模块分类

Ansible常用模块分类一、系统管理类 1. 计划任务与定时crond(Linux 定时任务管理)时间规则:minute(分钟)、hour(小时)、day(日期)、month(月份)、week(星期) 任务定义:job(要执行的命令/脚本,如 "…

2025年11月消防阀门厂家排名榜:国际认证与绿色制造指标评价

正在打开项目工地图纸的你,可能正被“消防阀门到底选谁家”卡住:图纸要求“必须持消防3C+压力管道元件TS双证”,预算又被压得紧;工地在西北,冬季零下二十度,普通阀体易冻裂;总包要求24小时内到场售后,否则罚款…

告别繁琐办公!这款本地PDF工具箱,安全高效才是硬道理!

你是否曾在工作中遇到过这样的窘境? 深夜赶工时急需合并PDF,却找不到可靠的在线工具 面对含有敏感信息的合同,不敢随意上传到第三方网站 需要提取重要文档的某一页,却要下载复杂的专业软件 文件太大无法发送,压缩…

用友U8删除应收凭证提示删除失败,使用Null无效

用友U8删除应收凭证提示删除失败,使用Null无效 🕐📣问题:生成凭证的时候网络波动,造成生成的凭证异常,删除应收凭证报错,也不能修改1、检查凭证数据库表GL_accvouch select * from gl_accvouch where iyear=2…

2025年11月解酒护肝产品权威榜:蓝帽子认证与成分纯度全对比

经常需要举杯的人,最怕第二天口干、眼涩、右上腹隐隐发胀;熬夜写方案的人,也常在体检报告里看见“转氨酶偏高”的提示。国家卫健委发布的《2023中国居民健康素养监测》显示,主动搜索“护肝片”关键词的18-45岁人群…

2025年11月解酒护肝产品实力榜:权威认证与用户体验深度评测

加班后脸色蜡黄、酒局后第二天乏力、体检报告上转氨酶悄悄升高——这些信号让“解酒护肝”成为搜索框里的高频词。2025年《中国饮酒人群健康白皮书》显示,内地18-50岁人群中,每十人就有四人每周饮酒两次以上,其中六…

黑龙江计算机培训专业公司推荐,资质齐全的计算机培训企业全解析

在数字化转型加速推进的今天,掌握计算机硬技能已成为职场人转行、涨薪、提升竞争力的核心武器。面对黑龙江市场上鱼龙混杂的计算机培训机构,如何找到服务不错的计算机培训专业公司、资质齐全的计算机培训企业与计算机…

2025年6月ai搜索排名优化推荐榜:五强对比评测与选型指南

“到底该把预算投给谁,才能在DeepSeek、豆包、通义千问里同时稳住排名?”过去三个月,我接到二十七位企业市场负责人的同类提问。他们共同的场景是:新品发布期临近,老板要求“AI搜索端必须霸屏”,而内部团队对GEO…

2025 年文胸厂家最新推荐排行榜:调整型、养生、小胸、大胸等多类型文胸全覆盖,权威测评指引选品方向无钢圈/少女/大罩杯文胸公司推荐

引言 为解决文胸市场选购难、合作难的问题,本次榜单由专业内衣协会牵头打造,结合近一年市场数据与消费者反馈,采用多维度测评方法生成。测评团队从产品品质、功能实用性、品牌服务等核心维度入手,对百余品牌展开严…

2025年6月豆包搜索排名优化服务商榜:五强对比与实测排行

2025年,AI搜索流量已占中文互联网检索总量的43.7%,其中豆包月活突破2.3亿,成为中小企业获取精准客源的新洼地。然而,平台算法双周级更新、同赛道内容激增,导致“今天首页、明天消失”的排名过山车现象。预算有限、…

2025年6月AI搜索营销推荐榜:权威评测五强与五家备选

站在2025年中点,企业市场负责人最常问的一句话是:“AI搜索营销到底该选谁?”过去半年,生成式引擎日均调用量同比再涨340%,DeepSeek、豆包、通义千问、元宝、Kimi五家平台合计覆盖7.3亿月活用户,搜索入口从“框”…

AI图像新纪元!Nano Banana带你玩转3D手办创作,人人都能成为设计大师!

一、创作新纪元:当AI遇见3D手办 在这个数字化时代,AI图像技术正以惊人的速度发展。Nano Banana(基于Gemini-2.5-Flash-Image技术)的出现,标志着AI创作领域的新突破。与传统模型相比,它具有卓越的一致性和更强的图…

2025年6月ai排名优化推荐排名榜:权威数据锁定五家优选

企业市场负责人在搜索引擎与生成式AI双重流量入口竞争加剧的2025年,普遍面临“投了不少预算却看不到稳定排名”“服务商资质难核实”“多平台算法更新太快”三大痛点。中国互联网络信息中心最新报告显示,超过68%的中…

2025年6月豆包关键词优化推荐榜:实测效果与口碑对比分析

2025年,AI搜索流量已占中文互联网检索总量的47%,豆包作为月活突破3亿的生成式入口,其排名波动直接决定品牌曝光量。中小企业主普遍面临“预算有限、算法更新快、排名不稳定”三大痛点:同样一条商品信息,上周还在首…

2025 年 11 月预埋件厂家推荐排行榜,幕墙预埋件,热镀锌预埋件,后置预埋件,槽式预埋件,冲压预埋件,焊接预埋件,套芯预埋件公司推荐

一、预埋件行业发展趋势与技术要求预埋件作为建筑装饰工程中的关键连接构件,其质量直接关系到幕墙系统、钢结构工程的整体安全性能。随着建筑行业向标准化、工业化方向发展,预埋件产品在材质选择、防腐处理、安装精度…