在现代C#开发中,异步编程已成为提升应用程序性能和响应能力的关键技术。当你需要同时执行多个耗时操作(如调用多个Web API、读取多个文件或查询多个数据库)时,逐个等待每个任务完成会大大拖慢程序运行速度。这时,Task.WhenAll 就派上用场了!

Task.WhenAll 是 C# 中 System.Threading.Tasks 命名空间提供的一个静态方法,用于并行启动多个异步任务,并在所有任务都完成后返回一个包含所有结果的数组(如果任务有返回值)。
它与顺序执行任务相比,能显著减少总执行时间,特别适合 I/O 密集型操作。
以下是 Task.WhenAll 的两种常用形式:
// 无返回值的任务Task.WhenAll(Task1, Task2, Task3);// 有返回值的任务(例如返回 string)string[] results = await Task.WhenAll(TaskA, TaskB, TaskC);假设我们需要从多个 URL 同时下载网页内容。使用 Task.WhenAll 可以让这些请求并行执行。
using System;using System.Net.Http;using System.Threading.Tasks;class Program{ static async Task Main(string[] args) { var urls = new[] { "https://httpbin.org/delay/1", "https://httpbin.org/delay/2", "https://httpbin.org/delay/1" }; using var client = new HttpClient(); // 创建任务列表 var tasks = urls.Select(url => DownloadContentAsync(client, url)).ToArray(); Console.WriteLine("开始批量下载..."); var startTime = DateTime.Now; // 使用 Task.WhenAll 并行执行所有任务 string[] contents = await Task.WhenAll(tasks); var endTime = DateTime.Now; Console.WriteLine($"全部下载完成!耗时: {(endTime - startTime).TotalSeconds:F2} 秒"); // 输出每个结果的长度 for (int i = 0; i < contents.Length; i++) { Console.WriteLine($"URL {i + 1} 内容长度: {contents[i].Length} 字符"); } } static async Task<string> DownloadContentAsync(HttpClient client, string url) { Console.WriteLine($"正在下载: {url}"); string content = await client.GetStringAsync(url); Console.WriteLine($"完成下载: {url}"); return content; }}在这个例子中,三个延迟不同的请求被同时发起,总耗时接近最长的那个请求(约2秒),而不是三个请求时间之和(约4秒)。这就是 C#并发处理 的威力!
如果 Task.WhenAll 中的任意一个任务抛出异常,整个 WhenAll 也会抛出异常。但要注意:所有任务仍会继续执行,即使其中一些失败了。
你可以通过遍历每个任务的 Exception 属性来获取所有错误:
try{ await Task.WhenAll(task1, task2, task3);}catch{ // 即使捕获异常,也可以检查每个任务的状态 if (task1.IsFaulted) Console.WriteLine($"Task1 错误: {task1.Exception?.Message}"); if (task2.IsFaulted) Console.WriteLine($"Task2 错误: {task2.Exception?.Message}");}.ToArray() 或 .ToList() 确保任务立即启动。SemaphoreSlim 限制并发数量,避免资源耗尽。Task.WhenAll 是 C# 异步编程中实现批量执行异步任务的核心工具。它不仅能大幅提升程序效率,还能简化代码逻辑。无论你是初学者还是有经验的开发者,掌握这一技巧都将让你的 C# 应用更加高效和健壮。
记住本文的四个核心关键词:C#异步编程、Task.WhenAll、批量执行异步任务 和 C#并发处理。它们是你深入理解现代 C# 开发的关键!
Happy Coding! 🚀
本文由主机测评网于2025-12-13发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025127320.html