当前位置: 首页 > news >正文

C# 异步编程的“三剑客”——Task,async和await

1. 生活类比:点外卖

想象你在餐厅点餐:

  1. Task (小票/订单)

你点完餐,服务员给了你一张小票。这张小票代表“未来会做好的一份饭”。你手里拿着小票,饭还没好,但你拥有了“获取饭的凭证”。

  • Task:代表一个正在进行或尚未完成的操作。

  • Task<int>:代表在这个操作完成后,你会得到一个 int 类型的结果(比如饭)。

  1. async (允许等待)

这就像是你这个人的一种能力。如果你标记为 async,说明你是一个“懂得利用等待时间”的人,而不是傻傻站在柜台前发呆的人。只有具备这个标记的方法,才能使用 await

  1. await (坐下玩手机)

当你拿到小票(Task)后,饭还没好。

  • 如果你没有 await(同步):你会像个木头人一样死死盯着后厨,什么都干不了,直到饭做好(阻塞线程)。

  • 如果你使用了 await(异步):你会说:“行,饭好了叫我。”然后你找个位置坐下玩手机(释放当前线程去处理别的事情)。等饭好了(Task 完成),你会自动放下手机,去取饭,然后继续吃饭。


2. 代码实战:如何使用

我们将对比“同步写法”和“异步写法”。

场景:模拟一个耗时的操作(比如下载文件)

C#

// 模拟一个耗时方法:下载数据
// 返回 Task<string> 表示这是一个异步任务,最终会给出一个 string
public async Task<string> DownloadContentAsync()
{Console.WriteLine("1. 开始下载...");// Task.Delay 模拟耗时 3秒// await 关键点:这里会暂停 DownloadContentAsync 的执行,// 把线程让出去做别的事(比如响应 UI 点击,处理其他 web 请求)await Task.Delay(3000); Console.WriteLine("3. 下载完成!");return "这是下载好的内容";
}

调用者如何使用

C#

public async Task MainMethod() // 注意:调用者通常也需要是 async
{Console.WriteLine("0. 准备开始");// 调用方法,立即拿到一个 task(小票),此时代码还没阻塞Task<string> task = DownloadContentAsync(); Console.WriteLine("2. 在等待下载的过程中,我可以做点别的...");// 关键点:await 就像把小票兑换成实物// 如果任务没完成,这里会“非阻塞”地暂停// 一旦任务完成,content 变量就会拿到 "这是下载好的内容"string content = await task; Console.WriteLine($"4. 拿到结果:{content}");
}

执行顺序输出:

  1. 0. 准备开始

  2. 1. 开始下载...

  3. 2. 在等待下载的过程中,我可以做点别的...

  4. (等待3秒,但这期间线程是自由的)

  5. 3. 下载完成!

  6. 4. 拿到结果:这是下载好的内容


3. 三者的职责总结

关键字/类 角色 作用 也就是...
Task / Task<T> 返回值 代表一个异步操作的对象。 “取餐小票”
async 修饰符 放在方法声明处。告诉编译器:“这个方法内部会用到 await,请把它编译成状态机。” “允许在这个方法里偷懒(挂起)”
await 运算符 放在 Task 前面。非阻塞地暂停当前方法,等待 Task 完成,并取出结果 “先去忙别的,完了叫我”

4. 两个绝对不能踩的“坑”

坑一:async void

永远不要async void,除非是 UI 的事件处理器(如 Button_Click)。

  • 错误: public async void DoWork() { ... }

  • 正确: public async Task DoWork() { ... }

  • 原因: async void 发生异常时,外层根本捕获不到,会导致程序直接崩溃。而 Task 可以包裹住异常。

坑二:.Result.Wait()

async 方法中,尽量不要使用 .Result 属性或 .Wait() 方法去强行获取结果。

  • 错误: var result = DownloadAsync().Result;

  • 后果: 这会将“异步”强制变成“同步阻塞”。在 WinForm/WPF 或 ASP.NET 早期版本中,这极大概率导致死锁(Deadlock),整个程序卡死。

  • 正确: 始终使用 await DownloadAsync();

http://www.jsqmd.com/news/341745/

相关文章:

  • 2026年度马鞍山汽车贴车衣费用大揭秘,推荐几家性价比高的店 - 工业推荐榜
  • 2026年2月中国电缆一线品牌推荐:电缆知名品牌、中国电缆十大品牌排名top榜 - 品牌2025
  • 接触角测量仪怎么选?哪家公司性价比高? - 品牌推荐大师
  • 如何0基础自学网络安全技术,推荐一个非常稳的网络安全学习路线
  • 什么是车载网关?有什么推荐?
  • 揭秘病毒式爆红的个人AI助手Moltbot:从龙虾主题到实际行动的AI革命
  • 探析2026年诚信的汽车贴膜专业公司,宣城口碑排名前十揭晓 - 工业品牌热点
  • 纯电动汽车两档ATM变速箱Simulink模型详解:仿真换挡策略与过程,含文档及注释,可运行体验版
  • 2026年贵州地区环形轻质瓦斯抽放管定制厂家,哪家性价比高? - 工业设备
  • 聊聊大模型推理系统之 Laser:从“整块执行”到“按需分层”,看Laser如何重新定义LLM调度单元
  • Nodejs毕设项目:基于nodejs的回忆小书屋小程序(源码+文档,讲解、调试运行,定制等)
  • MySQL之SQL语句执行过程详解
  • 2026年不锈钢螺旋筋瓦斯管质量好的厂家排名,你知道几家 - 工业品牌热点
  • 如何兼顾育儿与量子编码?单亲开发者的时间黑客
  • Zynq上UART/IIC/SPI的27个实验-第8课:PL AXI UARTLite 接收
  • 2026年真空上料机耐用型厂家排名,普非森助力企业生产 - myqiye
  • 剖析信誉好的惠姐装修专业公司,潮汕地区值得选的品牌 - mypinpai
  • 傲梅动态磁盘转换器3.2介绍及核心功能+工具分享
  • 测试脚本维护:AI减少技术债务的实操
  • 【2026-02-02】中年渴望
  • 2026年郑州口碑好的家政品牌企业推荐,专业家政机构全排名揭秘 - 工业推荐榜
  • nodejs+vue运动健康饮食健身追踪系统
  • vue2框架下如何优化大文件上传的方案总结?
  • 聊聊邦格公司敦煌徒步,导游讲解是否详细,口碑究竟怎么样 - myqiye
  • vue基于nodejs+vue的漫画动漫订阅系统天堂网31g9n442
  • jquery实现大文件分块上传的解决方案有哪些总结?
  • 大润发购物卡回收平台靠谱吗?避免陷阱的必备指南 - 团团收购物卡回收
  • Unity引擎程序员如何根据系统开发中遇到的痛点进行UI框架和UI组件的迭代
  • 大润发购物卡回收靠谱吗?揭秘最安全的回收平台选择 - 团团收购物卡回收
  • 大润发购物卡回收平台推荐:安全交易,0风险提现方法 - 团团收购物卡回收