C# 不提供 Green Threads,因其运行时(CoreCLR/Mono)不隔离线程调度权,所有 Task 均绑定 OS 线程,async/await 仅为状态机优化而非线程虚拟化;真正轻量级并发依赖异步 I/O 和 Task 复用,而非虚拟线程。
C# 没有 Green Threads,也没有官方的“虚拟线程”或“轻量级线程”抽象——这是 Java 21+ 的 VirtualThread、Go 的 goroutine 或 Erlang 的 process 才有的概念。C# 的 Task 和线程池调度机制(ThreadPool)是协作式 + 抢占式混合模型,但底层始终绑定 OS 线程。
为什么 C# 不提供 Green Threads
.NET 运行时(CoreCLR / Mono)从设计上不隔离线程调度权:所有 Task 默认由 ThreadPool 中的 OS 线程驱动,阻塞操作(如 Thread.Sleep、同步 I/O)会真实挂起 OS 线程。没有用户态调度器,也就无法实现真正的 green thread。
-
async/await只是状态机编译优化 +Task调度协作,并非线程虚拟化 - Mono 曾实验过 cooperative threading(
--cooperative模式),但已弃用且不兼容现代 .NET - .NET 6+ 的
System.Threading.Channels或Channels+ValueTask仍运行在 OS 线程之上
C# 中最接近“轻量级并发”的实际做法
开发者常把高并发 I/O 场景误认为“需要虚拟线程”,其实 .NET 已通过异步 I/O + Task 复用做到极低开销: