0

0

C#怎么使用Task.WhenAll和Task.WhenAny C#并行任务处理方法

星降

星降

发布时间:2026-01-16 13:47:29

|

521人浏览过

|

来源于php中文网

原创

task.whenall 等所有任务完成并聚合结果,顺序与输入一致,任一失败则整体失败;task.whenany 返回最先完成的任务(task),适用于竞速场景,其余任务不受影响。

c#怎么使用task.whenall和task.whenany c#并行任务处理方法

Task.WhenAll 和 Task.WhenAny 是 C# 中用于协调多个异步任务的核心工具,它们不直接执行并行计算,而是帮你“等待多个任务的完成状态”——一个等全部,一个等最先完成的那个。

Task.WhenAll:等所有任务都完成

当你有一组独立的异步操作(比如同时调用多个 API、读取多个文件),且必须等它们全部结束才能继续时,就用 WhenAll。它返回一个 Task(如果原任务是 Task,则返回 Task),这个 Task 在所有输入任务完成后才完成。

常见写法:

  • 传入 Task[] 或 IEnumerable,例如:await Task.WhenAll(task1, task2, task3)await Task.WhenAll(tasks)
  • 如果任意一个任务出错(抛异常或进入 Faulted 状态),WhenAll 返回的任务也会立刻变成 Faulted,异常信息会封装在 AggregateException 中(可遍历 InnerExceptions 查看具体哪个任务失败)
  • 所有任务成功时,返回值是结果数组,顺序和传入顺序一致 —— 即使某个任务实际完成得晚,结果位置也不变

Task.WhenAny:只等第一个任务完成

适用于“谁先回来就先处理谁”的场景,比如:对同一请求发起多个冗余服务调用(如不同 CDN 节点),取最快响应;或实现带超时的等待逻辑。

Pebblely
Pebblely

AI产品图精美背景添加

下载

关键点:

  • 返回的是 Task,即“一个代表‘最先完成的那个任务’的 Task”,需 await 两次才能拿到实际结果(第一次等 WhenAny 完成,第二次等那个被选中的任务完成)
  • 被选中的任务一定处于 RanToCompletion、Faulted 或 Canceled 状态;其余任务仍可能在运行中,不会被取消或中断 —— 你得自己决定是否要取消它们(比如用 CancellationToken)
  • 如果有多个任务几乎同时完成,WhenAny 只返回其中任意一个(无确定顺序保证)

简单对比与选用建议

两者不是替代关系,而是解决不同问题:

  • 需要聚合结果(如汇总所有接口数据)→ 用 WhenAll
  • 需要快速响应或做“竞速选择”→ 用 WhenAny
  • 想等所有任务但允许部分失败后继续?不能直接靠 WhenAll —— 得先把每个任务包装成不抛异常的版本(例如用 task.ContinueWith(t => t.Exception?.InnerException) 或 try/catch 包一层)

一个小提醒:别混淆“并发”和“并行”

WhenAll/WhenAny 本身不开启线程或强制并行;它们只是调度和等待已启动的异步任务。真正是否并发,取决于你传进去的任务本身(比如 HttpClient.GetAsync 是 I/O 异步,不占线程;Task.Run(() => CPUWork()) 才会用线程池线程)。所以不要以为用了 WhenAll 就自动多线程了 —— 它只是让等待更高效。

基本上就这些。用对场景,再注意异常处理和任务生命周期,这两个方法就很稳。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1770

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

569

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2338

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

43

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

723

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

372

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

26

2026.01.21

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

0

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 5.7万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.1万人学习

ASP 教程
ASP 教程

共34课时 | 5.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号