.NET 中 .Result 避坑指南:不同框架下的死锁与线程池饥饿
这篇只讲一个知识点:在 .NET 代码里用 .Result(或 GetAwaiter().GetResult())同步阻塞异步任务,为什么在不同框架下会触发不同类型的事故。 问题背景 同样一行代码,在两个系统里出现了完全不同的故障: 老系统(ASP.NET MVC 5)请求直接卡死,不返回 新系统(ASP.NET Core)不是直接死锁,而是高峰期吞吐突然掉到很低,请求排队超时 两边都有这段写法: …
这篇只讲一个知识点:在 .NET 代码里用 .Result(或 GetAwaiter().GetResult())同步阻塞异步任务,为什么在不同框架下会触发不同类型的事故。 问题背景 同样一行代码,在两个系统里出现了完全不同的故障: 老系统(ASP.NET MVC 5)请求直接卡死,不返回 新系统(ASP.NET Core)不是直接死锁,而是高峰期吞吐突然掉到很低,请求排队超时 两边都有这段写法: …
很多服务在压测里吞吐不错,一上生产就抖。根因常常不是业务逻辑,而是内存分配模式不健康。 典型表现: GC 频率偏高 P99 周期性尖峰 单机吞吐不稳定 这篇文章重点讲“如何减少无意义分配”,并把优化控制在团队可维护范围内。 问题背景 真实现场:一次常规版本上线后,接口平均耗时变化不大,但 P99 从 120ms 拉到 380ms,最后定位到的是字符串拼接和临时数组在高峰时段触发了更频繁的 GC。 …
接口慢,不一定是数据库慢。很多系统在高峰期的核心问题,是异步链路写法导致线程池被慢慢耗空。 这类问题最麻烦的地方在于: CPU 不一定打满 错误日志不一定明显 本地压测可能复现不出来 这篇文章围绕一个目标展开:让异步代码在高并发下“稳态运行”,而不是“平时很快,高峰崩盘”。 1. 问题背景:为什么会出现线程池饥饿 常见触发方式: 在 ASP.NET Core 请求中使用 .Result / …