-
一句 LINQ 查了五六遍:C# 延迟执行避坑复盘
有个报表接口从数据库查出一批订单再做几轮统计:算总数、算总金额、按状态分组,代码用 LINQ 写得清清爽爽我自觉优雅极了。可上线后这个接口慢得离谱,几百条数据的报表能跑好几秒,逻辑明明很简单数据量也不大怎么会这么慢?直到打开数据库 SQL 日志整个人都不好了:就这一次接口调用,同一条查询订单的 SQL 被原原本本执行了五六遍。我明明只写了一句 db.Orders.Where,怎么会查五六次?真凶浮…- 2
- 0
-
从同步阻塞思维写一个高并发服务把所有 IO 都让线程死死占着一步步往下执行直到彻底完成、还为图省事在同步方法里用 .Result 等异步调用埋下 sync-over-async 反模式、一次促销流量只比平时高三四倍这种占着线程啥也不干的死等调用大量出现就把 IIS 线程池迅速占满耗尽线程池一空整个应用再没线程处理任何新请求守着 32 核服务器 CPU 闲在 5% 而所有 API 集体超时挂死 + 处理字符串数组挥霍内存毫无知觉解析报文用 Substring 一刀刀切每次都实打实分配新字符串拷贝一份拼接直接加号怼字节数组动不动 new 再 Array.Copy 在高频热路径上极短时间制造海量用完即弃的短命临时对象把 GC 喂到频繁暂停服务成片卡顿延迟毛刺 + JSON 序列化清一色 Newtonsoft 一把梭它靠运行时反射每次都探查类型动态读值在每秒序列化成千上万对象的高频服务里反射开销高居 CPU 热点榜还造一堆装箱临时垃圾反过来加剧 GC 卡顿 + 用 LINQ 却以为写下 Where 那行查询就执行完了根本不懂延迟执行把查询赋给变量先 Count 再 foreach 后 Any 同一查询被完整重跑三四遍又在循环里访问关联属性触发 N+1 一百个订单打一百零一次库直接打爆数据库 + 写服务类要用数据库 HTTP 日志就直接在类里 new 一个出来依赖被 new 死在内部绑死具体实现想换实现想测试注入 mock 都做不到测试只能连真库又慢又脆还自己手搓 static 单例埋多线程竞态 + 配置全堆 web.config 用 ConfigurationManager 字符串键去取键散落十几个文件改名漏一个就错把 SmtpHost 敲成 SmtpHsot 编译器毫不知情上线取出 null 才炸取出全是字符串还得自己 Parse + 引用类型默认可空类型完全不透露可空信息拿个参数无从知道会不会传 null 访问 order.Customer.Name 全凭运气 NullReferenceException 成了线上最阴魂不散的异常编译期毫无征兆全到线上特定路径才轰然爆发 + 应用被 .NET Framework 死死绑在 Windows 上只能上 Windows Server 装特定版本运行时还和别的应用共享互相牵制要配 IIS 管应用池环境稍不一致就诡异出错想上 Linux 容器享受云原生弹性精简门都没有 → 2026 现代 .NET 8 对所有 IO 用 async/await 全程异步 await 时线程被释放归还线程池服务别的请求同样线程数撑起高一个数量级并发 + Span 与 ReadOnlySpan 零拷贝切片 ArrayPool 租借复用缓冲把热路径分配压到极低 GC 压力骤降 + System.Text.Json 源生成器编译期生成直达序列化代码运行时零反射快且低分配还通 AOT + 吃透延迟执行该物化时一次 ToList 用 Include 预加载与 Select 投影根治 N+1 收敛成一次往返 + 内置 DI 容器构造函数注入只依赖接口可注入 mock 测试生命周期 Singleton/Scoped/Transient 由容器统一托管 + IConfiguration 加 IOptions 把一组配置强类型绑定到配置类属性强类型编译期可查分组归属清晰 + 开启可空引用类型把可空与否写进类型编译器流分析在编译期就揪出潜在 null 解引用逼你判空 + 迁到 .NET 8 跨平台用内置 Kestrel 宿主 self-contained 把运行时打包进产物容器把应用连同环境封成自给自足镜像一次构建哪都能跑接入 K8s 弹性伸缩 87 天战役复盘:47 套工程修法 + 7 个 P0 复盘 + 6 条工程哲学
8 人的 .NET 团队 87 天把一套支撑公司核心业务、在 Windows Server 加 IIS 上跑了八年、从当年整洁的 MVC 长成一坨同步阻塞反射横飞到处 new 配置散落空引用满天飞的 .NET Framework 4.x 祖传 C# 应用,系统性地现代化到 .NET 8——把我们彻底打醒的是一次再普通不过的流量高峰,促销带来的并发只比平时高三四倍本不该出事,可代码里一处在同步方法里…- 2
- 0
-
从古老 .NET Framework 4.x 体系 应用只能跑 Windows 挂 IIS 换不动平台 + 全程同步阻塞 IO 一上量线程池就耗尽假死 + 数据访问 ADO.NET 手写 SQL 字符串拼接埋着注入隐患 + 序列化全靠 Newtonsoft 反射又慢又吃内存 + 依赖全靠手动 new 或硬塞第三方容器对象图一团乱 + Web 层还是 Web Forms 老 MVC 一堆样板 + 值类型装箱拆箱满天飞 GC 压力山大 + 到处 NullReferenceException 半夜被叫起来查空指针 + 配置塞 web.config 的 XML 里改一下要重启 + 启动靠 global.asax 满地反射又慢又黑盒 → 2026 现代 .NET 8/9 体系 跨平台自宿主 Kestrel 容器化 + async/await 全链路异步 + EF Core 参数化 ORM + System.Text.Json 源生成序列化 + 内建依赖注入容器 + Minimal API + Span/Memory 零分配高性能 + 可空引用类型消灭空指针 + appsettings.json + IOptions 强类型配置 + 顶级语句 + Generic Host 通用主机 + Upgrade Assistant 渐进迁移 87 天战役复盘:47 套工程修法 + 7 个 P0 复盘 + 6 条工程哲学
12 位 .NET 平台与后端工程师 87 天把一套用了八年的粗放 .NET Framework 4.x 体系——应用先天只能跑 Windows 必须挂在重量级 IIS 里进不了 Linux 容器、全程同步阻塞 IO 处理线程执行到查库调接口就死等白白占着一上量线程池瞬间耗尽服务假死而 CPU 闲着、数据访问用裸 ADO.NET 把 SQL 字符串拼接出来埋着致命注入隐患还要手写开连接建命令绑参数…- 0
- 0
-
从 .NET Framework 4.8 + WCF + IIS + Windows Server + 自研日志 + 单进程部署 → .NET 9 + ASP.NET Core 9 + Minimal API + EF Core 9 + gRPC + Aspire + Orleans + YARP + Native AOT + Chiseled Ubuntu + OpenTelemetry 全栈现代化 87 天踩坑录:21 反模式 + 23 修法
27 位 .NET 工程师 87 天把公司 .NET Framework 4.8 + WCF + IIS + Windows Server + 自研日志 + 单进程部署 整体迁移到 2026 年 .NET 9 + ASP.NET Core 9 + Minimal API + EF Core 9 + gRPC + Aspire + Orleans + YARP + Native AOT + Chis…- 4
- 0
-
从 .NET 6 / Framework 4.8 杂烩 → .NET 9 + C# 13 + ASP.NET Core 9 + Minimal API + Native AOT + EF Core 9 + Aspire + Orleans 全栈升级 36 天踩坑录:13 反模式 + 14 修法
41 位 C# 工程师 36 天把公司 .NET 技术栈全栈从 .NET 6 / Framework 4.8 / EF Core 6 / ASP.NET Core 6 升级到 .NET 9 + C# 13 + ASP.NET Core 9 + Minimal API + Native AOT + EF Core 9 + gRPC.NET 2.66 + MassTransit 8.3 + Media…- 0
- 0
-
从 .NET 6 → .NET 9 + Aspire + Native AOT 大型 SaaS 升级 16 天踩坑实录:8 个反模式与 10 套修法
某 B2B SaaS 公司 17 个 service 从 .NET 6 升级到 .NET 9 + Aspire 9.1 + Native AOT + EF Core 9。16 天踩 8 个反模式:upgrade-assistant 一键误改、EF Core 9 LINQ 翻译变化致 P99 飙升、AOT 60% 三方包不兼容、Aspire 本地资源吃满 28GB、OTel 字段命名漂移、gRPC …- 2
- 0
-
ASP.NET Core 报表导出 90k 行 Pod 内存 90 秒冲到 6.1GB OOM 的 5 天复盘:EF Core ChangeTracker + LazyProxies + N+1 三层叠加根因 + projection 流式优化全过程
EF Core 8 默认行为踩雷复合性能反模式,导出 9 万行工单 90 秒内 Pod 内存从 1.5GB 冲到 6.1GB OOM。5 天复盘揪出 ChangeTracker 持有 + LazyProxies N+1 + ToList 全加载三层叠加根因,4 层修法 + 7 种 EF Core 反模式表 + 决策树 + 8 条 .NET ORM 性能纪律,最终内存降到 320MB 耗时降到 18…- 0
- 0
EF Core
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!







