8 月 12 日凌晨,微软发布了 .NET 11 Preview 7。.NET 官方博客按往年节奏,这是正式版前最后一个大规模塞新特性的预览版——接下来是 RC,11 月 .NET Conf 上正式发布。知乎如果你想在 .NET 11 落地前只找一个时间点搞懂这一版,现在就是。

这一版里最值得聊的不是又多了几个 API,而是:C# 用了十几年的 async/await,执行机制要在运行时层面被换掉了。社区管它叫 “async 2”,官方名字叫 Runtime Async,是 .NET 11 毫无争议的头号工程。
状态机模型,为什么要换
现在你写的每一个 async 方法,编译器都会在编译期把它改写成一个状态机。问题有三个:编译器以方法为单位变换,看不到整条异步调用链,JIT 没法做跨方法优化;生成的 MoveNext 方法通常很大,JIT 基本不会内联;每调用一层异步方法都可能包装一个 Task 对象,调用链越深,分配越多。
关键是:相当多的异步方法从头到尾根本不会真正暂停。这时候状态机的开销就是纯亏——抽象税交了,服务没享受到。
换完之后有多快
新机制一句话概括:不暂停,就不付费。编译器不再提前展开状态机,把异步控制流原样交给 JIT。整条链没暂停时,参数和返回值直接走寄存器,跟普通同步调用几乎没有区别,Task 对象压根不创建;只有真的暂停了,才临时分配一个几十字节的 Continuation 保存现场。
社区里 hez2010 做了一组正面对比:.NET 10 的传统 async 对 .NET 11 的 Runtime Async,各场景跑一亿次。不暂停的场景,性能提升接近 20 倍,基本追平同步基线,内存分配和 GC 直接归零。知乎Task.Yield 场景,从每秒 412 万次提到 2884 万次,约 7 倍。知乎真暂停的场景,ThreadPool / TaskCompletionSource 延续提升 3~4 倍,异步调用链深度场景提升 7.4 倍,链越深赚得越多。

微软自己的测试也有印证,TechEmpower platform-json 一项里,预热期最大分配速率从大约 110MB/s 降到 8MB/s 左右。知乎要泼一盆冷水:这些数据都来自预览版和每日构建,不代表你的 Web API 换上就快几倍。收益最大的,是 RPC、数据库客户端、消息系统、网关这类异步链又深、调用又频繁的场景。
这条路,其实先死过一次
值得一提的是,微软在 Runtime Async 之前先试过 Green Thread(绿线程)路线,类似 Go 的 goroutine、Java 的虚拟线程,后来官方放弃了。原因很现实:绿线程上做 1 亿次系统调用,从约 300ms 恶化到约 1800ms,慢 5 倍以上;放进 ASP.NET Core 实测,RPS 不升反降;还和 Intel CET Shadow Stack 这类硬件安全机制冲突。知乎这段弯路其实回答了一个更重要的判断:.NET 选择的是"把现有 async 做快",而不是"用新并发模型取代 async"。你的方法签名还是 Task
社区在吵什么
翻了翻知乎和 B 站的讨论区,反应大致分几派:
等技术落地的:“等这个稳定了,我就适配到单片机”——连做嵌入式的都在蹲。知乎
确认兼容性的:有人问 Runtime Async 支持 AOT 吗,作者回复"支持的";iOS 这种不让 JIT 的环境也没问题,因为 NativeAOT 和 JIT 用的是同一个编译器。
焦虑 ValueTask 的:"以后还有必要用 ValueTask 吗?"dotnet/runtime 的官方讨论帖里也在聊这个话题。
保持清醒的:“夸出花来了,但仍然传染”——async 一路向上传染的问题,这次改造并不解决。知乎
还有人在争"这是不是 C# 有史以来最大的升级",反对票投给了 .NET Framework 2.0→3.0 和 Span、NRT、模式匹配。
B 站预览视频的评论区则被 C# 15 的另一个新特性带跑了:带标签的 break/continue。高赞评论是"再见了,goto 小弟",还有人说"c#将是极少数既有goto又有labeled loop的语言"。哔哩哔哩提醒一句:这个特性目前还是预览特性,要用得开 LangVersion preview。
Preview 7 里其他值得分一点注意力的变化
dotnet CLI 的 NativeAOT 快速路径默认开启了:能走 AOT 路径的命令不再启动第二套 CoreCLR,官方测试约快 5.5 倍,dotnet dev-certs https、dotnet ef 这类命令从约 700ms 降到 200ms 出头。知乎出问题可以用 DOTNET_CLI_ENABLEAOT=false 关掉。MSBuild Server 常驻热工作进程也默认开了,连续 build、test 少重复启动。
dotnet test 加了运行级的 --timeout 和 --maximum-failed-tests 参数:整个测试会话可以限定"最多跑多久",也能设定累计失败多少个就立刻停。.NET 官方博客设想 5000 个测试里前 50 个已经连炸 20 个,剩下 4950 个再慢慢跑完纯属浪费机器——大型 CI 终于有了原生的 fail-fast 手段。

ZIP 原生支持密码和 AES-128/192/256 加密,报表导出、备份类场景终于不用引第三方库了。
System.Numerics 新增 Decimal32 / Decimal64 / Decimal128,IEEE 754 十进制浮点,支持无穷大和 NaN,接入泛型数学,金融和科学计算多了新选项。
Blazor Server 的 Circuit 支持后台标签页自动暂停,服务器资源省下来,用户切回来再恢复;正在输入、播视频时会自动延后暂停,不会丢数据。
WinForms 也有新视觉样式模式和 using 风格的批量更新 API,一次塞几千条数据到 ListBox 不再卡成 PPT。
避坑提醒:Microsoft.Data.Sqlite 不再支持 netstandard2.0,等于放弃 .NET Framework。知乎–no-build 不再隐式构建项目引用;Blazor 的 Virtualize、压缩选项的 WindowLog 等 API 有改名。升级前把官方发布说明的 Breaking Changes 过一遍。
到底要不要跟?分情况说
高并发后端、做框架和基础设施的,已经在 .NET 9/10 上:值得现在就开个 Preview 7 分支跑测试。Runtime Async 的收益集中在你们的场景,早测早知道第三方库兼容问题。
一般业务团队:等 9 月前后的 RC1。特性冻结、破坏性变更基本定型后再评估,成本最低。
还在 Framework 4.8、WinForms 上位机的朋友:不用急着上 .NET 11。这一版是 STS 标准支持(约两年),不是 LTS。真要动,更合理的路线是今年先迁 .NET 10 LTS(三年支持),2027 年再看 .NET 12 LTS。好消息是新语言特性可以通过 LangVersion 提前用上,老框架也能写新语法。
接下来值得盯的信号:9 月前后 RC1 是否冻结 Runtime Async、11 月正式版它是否默认开启、EF Core 这类大库的跟进节奏。
最后聊一句:你的生产项目现在跑在哪个版本上?4.8、.NET 6,还是已经 10 了?评论区对一下。