C# Task 进阶:WaitAll / WaitAny / WhenAll / WhenAny
一、Task 同步阻塞WaitAll 与 WaitAny1. 核心原理WaitAll、WaitAny 属于同步阻塞方法执行后会阻塞当前主线程等待任务集合满足条件后才继续执行后续代码。Task.WaitAll()阻塞线程等待集合中所有任务全部执行完毕才放行后续代码Task.WaitAny()阻塞线程只要集合中任意一个任务执行完毕立刻放行后续代码案例中设置无限循环任务用于直观测试单个任务完成触发 WaitAny、永久无法全部完成触发 WaitAll 阻塞。2. 独立完整代码private void button1_Click(object sender, EventArgs e) { TaskFactory factory new TaskFactory(); ListTask taskList new ListTask(); // 添加三个异步任务第三个任务无限循环永不结束 taskList.Add(factory.StartNew(() { Console.WriteLine(查询数据库); })); taskList.Add(factory.StartNew(() { Console.WriteLine(查询缓存); })); taskList.Add(factory.StartNew(() { while (true) { } Console.WriteLine(查询接口); })); // 同步阻塞任意一个任务完成即放行 Task.WaitAny(taskList.ToArray()); // 所有任务满足条件后执行 Console.WriteLine(至少一个操作执行完毕主线程放行); }3. 注意事项WaitAll、WaitAny 为同步方法会直接阻塞UI主线程造成窗体卡死WinForm 项目慎用存在永久执行的任务时WaitAll 会永久死锁阻塞永远无法放行WaitAny 只判断首个完成的任务不关心剩余任务执行状态适用于控制台程序同步等待不推荐窗体UI线程直接调用二、Task 异步回调WhenAll 与 WhenAny1. 核心原理WhenAll、WhenAny 属于异步非阻塞方法不会阻塞主线程主线程代码会直接向下执行。需搭配ContinueWith实现任务完成后的回调逻辑。Task.WhenAll()所有任务执行完毕后触发回调方法Task.WhenAny()任意一个任务执行完毕后立刻触发回调方法功能和 WaitAll/WaitAny 一致核心区别为异步不阻塞UI是项目开发主流用法。2. 独立完整代码private void button2_Click(object sender, EventArgs e) { TaskFactory factory new TaskFactory(); ListTask taskList new ListTask(); taskList.Add(factory.StartNew(() { Console.WriteLine(查询数据库); })); taskList.Add(factory.StartNew(() { Console.WriteLine(查询缓存); })); taskList.Add(factory.StartNew(() { while (true) { } Console.WriteLine(查询接口); })); // 异步非阻塞任意任务完成后触发回调 Task.WhenAny(taskList.ToArray()).ContinueWith(t { Console.WriteLine(至少一个异步操作执行完了); }); // 主线程不阻塞直接执行 Console.WriteLine(主线程继续执行不卡顿); }3. 注意事项When 系列方法异步无阻塞完美解决UI卡死问题优先用于WinForm/WPF项目必须搭配 ContinueWith 使用否则无法捕获任务完成事件主线程代码执行顺序优先于回调代码存在死循环任务时WhenAll 回调永远不会触发三、TaskFactory 自带回调ContinueWhenAll / ContinueWhenAny1. 核心原理ContinueWhenAll、ContinueWhenAny是任务工厂专属方法属于语法糖等价于 WhenAll/WhenAny ContinueWith 的组合写法代码更简洁。ContinueWhenAll所有任务完成后自动执行回调ContinueWhenAny任意一个任务完成后自动执行回调2. 独立完整代码private void button3_Click(object sender, EventArgs e) { TaskFactory factory new TaskFactory(); ListTask taskList new ListTask(); taskList.Add(factory.StartNew(() { Console.WriteLine(查询数据库); })); taskList.Add(factory.StartNew(() { Console.WriteLine(查询缓存); })); taskList.Add(factory.StartNew(() { while (true) { } Console.WriteLine(查询接口); })); // 工厂自带回调任意任务完成触发 factory.ContinueWhenAny(taskList.ToArray(), (t) { Console.WriteLine(至少一个操作执行完了); }); }3. 注意事项无需手动写 WhenAny/WhenAll 和 ContinueWith封装度更高仅 TaskFactory 创建的任务集合推荐使用该写法本质仍是异步回调不会阻塞主线程四、Task 单个任务限时等待 Wait(int 毫秒)1. 核心原理单个 Task 自带Wait(毫秒)重载方法作用是限时同步阻塞等待任务执行。等待时间内任务完成则直接放行超时则主动结束等待继续执行后续代码。2. 独立完整代码private void button4_Click(object sender, EventArgs e) { Task t1 new Task(() { Console.WriteLine(任务执行中); Thread.Sleep(2000); // 任务耗时2秒 }); t1.Start(); // 限时等待1秒超时自动放行 t1.Wait(1000); Console.WriteLine(等待结束执行后续代码); }3. 注意事项属于同步阻塞方法限时期间会卡住UI线程可用于控制任务最大执行时长防止任务无限阻塞程序超时后任务不会终止仍在后台继续执行只是主线程不再等待五、核心知识点终极对比总结同步阻塞卡死UIWaitAll、WaitAny、Task.Wait(毫秒)适合控制台、后台同步逻辑异步非阻塞推荐WhenAll、WhenAny ContinueWith适合WinForm界面开发工厂简写ContinueWhenAll/ContinueWhenAny简化异步回调代码核心区别Wait系列阻塞主线程When系列不阻塞仅通过回调处理任务结果六、Task 同步/异步等待方法终极对比表汇总所有等待方法的核心差异清晰区分阻塞特性、用法、场景为考试和开发高频考点。方法分组具体方法阻塞核心功能配套写法适用场景核心特点同步阻塞WaitAll是等待全部任务完成放行直接调用控制台同步批量任务顺序可控卡死UI死循环会永久阻塞WaitAny是等待任意一个任务完成放行直接调用多任务快速响应响应快阻塞UI忽略剩余任务Wait(毫秒)是单个任务限时等待、超时放行绑定单个Task限制任务最大时长可超时管控超时任务后台继续运行异步非阻塞WhenAll否全部任务完成触发回调搭配ContinueWithWinForm批量异步收尾UI流畅需回调处理结果WhenAny否任意任务完成触发回调搭配ContinueWith多任务异步择优回调高效不阻塞需手动处理未完成任务ContinueWhen 系列否封装When回调一键执行TaskFactory专属工厂任务简洁开发代码极简仅适配工厂创建任务表格核心总结必背考点阻塞核心Wait 系列全为同步阻塞卡死UIWhen 系列全为异步非阻塞界面流畅功能等价WaitAll ↔ WhenAll、WaitAny ↔ WhenAny仅阻塞特性不同开发首选窗体程序优先使用 When 系列控制台可使用 Wait 系列语法糖ContinueWhen 系列是 WhenContinueWith 的简化写法专为任务工厂设计

相关新闻

Android16 蓝牙打开时,状态栏显示蓝牙图标

Android16 蓝牙打开时,状态栏显示蓝牙图标

说明 本修改主要针对 Android 16(API 36)AOSP 源码中的 SystemUI 模块。项目内容适用版本Android 16(API 36)涉及模块frameworks/base/packages/SystemUI修改类PhoneStatusBarPolicy修改方法updateBluetooth()在 Android 16 原生 …

2026/7/23 15:24:39 阅读更多 →
LangGraph原理逻辑-多智能体架构(一)

LangGraph原理逻辑-多智能体架构(一)

LangGraph的底层原理一、速了解LangGraph二、 LangGraph到底是干什么的?三、快速体验LangChain与LangGraph3.1. 代码对比 (基础)3.2. 代码对比 (添加工具)总结一、速了解LangGraph LangGraph是一个功能非常强大的大语言模型本地…

2026/7/21 8:37:02 阅读更多 →
TFRS工业级推荐系统实战:从双塔模型到业务可解释性

TFRS工业级推荐系统实战:从双塔模型到业务可解释性

1. 项目概述:这不是“调个库就完事”的推荐系统,而是用TFRS把业务逻辑焊进模型里的实战 如果你在搜索“TFRS 推荐系统”时,看到的全是几行代码跑通MovieLens数据集的教程,然后戛然而止——那你不是没找到答案,而是还没…

2026/7/21 8:37:02 阅读更多 →

最新新闻

信号链设计实战:从放大器选型到系统集成,工程师避坑指南

信号链设计实战:从放大器选型到系统集成,工程师避坑指南

1. 信号链:从物理世界到数字世界的桥梁在任何一个需要感知、测量或控制物理世界的电子系统中,信号链都是其最核心的“神经系统”。无论是工业自动化产线上检测零件尺寸的传感器,还是医疗设备中监测生命体征的探头,亦或是智能手机里…

2026/7/23 15:26:17 阅读更多 →
DS92LV1260多通道高速解串器:六合一冗余设计、BLVDS接口与PCB布局实战

DS92LV1260多通道高速解串器:六合一冗余设计、BLVDS接口与PCB布局实战

1. 项目概述:为什么我们需要多通道高速解串器?在工业自动化、机器视觉或者高端通信设备里,我们常常会遇到一个头疼的问题:系统里布满了密密麻麻的线缆。想象一下,一个摄像头模组有10位数据要传给主控板,如果…

2026/7/23 15:26:17 阅读更多 →
LabVIEW与Node-RED通过MQTT实现工业数据采集与转发方案

LabVIEW与Node-RED通过MQTT实现工业数据采集与转发方案

最近在做一个工业数据采集项目时,遇到了一个典型问题:产线上的 LabVIEW 程序负责采集设备数据,但需要把这些数据实时推送到 Web 前端展示。传统方案是用 LabVIEW 的 TCP/IP 模块直接写接口,但每次设备增减或协议调整都要改代码&am…

2026/7/23 15:26:17 阅读更多 →
67个AI编程必会知识,1.6w字一次讲透!女友:“你要考研啊?!”

67个AI编程必会知识,1.6w字一次讲透!女友:“你要考研啊?!”

67个AI编程必会知识,1.6w字一次讲透!女友:“你要考研啊?!” 作者:资深技术博主—## 前言:为什么你不需要“考研”也能玩转AI编程?“你要考研啊?!”当女友看到…

2026/7/23 15:26:17 阅读更多 →
【全网首发】Claude Code v2.1.217 突发暴更:解锁 Emoji 表情智能补全、防范 Subagent 算力风暴失控、彻底拔除 MCP 内存泄漏!

【全网首发】Claude Code v2.1.217 突发暴更:解锁 Emoji 表情智能补全、防范 Subagent 算力风暴失控、彻底拔除 MCP 内存泄漏!

就在刚刚,Anthropic 针对其大热的终端 AI 结对编程工具 Claude Code 闪电推送了最新的 v2.1.217 版本!伴随着本周初针对超长会话 $O(N^2)$ 计算卡顿的拯救以及沙箱网络隔离的解耦,本次更新将焦点对准了多智能体并发风暴的算力兜底、内存与硬盘…

2026/7/23 15:26:17 阅读更多 →
LMK041xx双PLL时钟发生器:从寄存器配置到环路滤波器设计的实战指南

LMK041xx双PLL时钟发生器:从寄存器配置到环路滤波器设计的实战指南

1. 项目概述:深入理解LMK041xx双PLL时钟发生器在高速数字系统、通信设备或者精密测量仪器中,一个稳定、纯净且灵活的时钟源往往是整个系统稳定运行的基石。无论是FPGA、高速ADC/DAC,还是SerDes收发器,都对时钟信号的抖动、相位噪声…

2026/7/23 15:25:17 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻