协程 和 async await

协程, 是 为了 避免 闭包传递变量 的 性能损耗 而产生  。

如果不是 为了 避免 闭包传递变量 的 性能损耗 ,    线程池 和 Task 已经够了,  不需要 再设计 出 协程 来  。

 

闭包, 会 让 所有共享 的 变量 变成 引用 访问 的 方式,包括 值变量  。

因为 闭包 是将 变量 放到 堆 里 共享  。

 

协程 就是在 堆 里  模拟出一个   堆栈 和 协程“上下文”  存储区,  这和 操作系统 的 线程 堆栈 和 上下文 架构 是 相似  的  。

上下文存储区 保存 每个 协程 的  堆栈 的 栈顶 栈底,   在 切换 协程 时,  将 栈顶 栈底 存入 CPU 寄存器, 

这样,  代码 中 对 变量 的 访问 就可以 和 线程 一样,  通过 编译在 指令中 的 偏移量 操作数 加上 栈底  的 地址 就可以得到 变量 的 地址  。

这样 对  函数  局部变量 的 访问 就和 线程 一样 ,  指令 偏移量 操作数 +  栈底 ,    这样 一次 寻址  。

避免了   闭包     将 变量 变成 引用访问 的 二次寻址 带来 的 性能损耗   。

 

所以,  C#   的    async  await      本身 就 包含了 一个 协程 的 实现,    这大概也是  C#  async  await     要通过 编译器  把 代码 编译为 状态机 而不是      Task.ContinueWith()    的  原因   。

 

协程 需要  编译器 在 汇编 层面  实现,   不能 通过 高级语言 的 类库 / 封装 / 设计模式   的  方式实现  。

 

InnerC   还不能 描述 协程,    可以考虑 给 InnerC 增加    协程   的 语法支持  。

 

在 现阶段,    协程 是一个 有 技术含量 和 竞争力 的 技术  。

 

 

posted on   凯特琳  阅读(1011)  评论(2编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示