处理高并发请求,核心不是“拼命加线程”,而是合理利用异步、非阻塞、限流和资源复用。C#(尤其是 .NET 6+)已内置大量高并发友好特性,关键在于用对地方。
用 async/await 替代同步阻塞调用
数据库查询、HTTP 调用、文件读写等 I/O 操作是并发瓶颈主因。同步等待会独占线程,线程池迅速耗尽。改用异步 API 可释放线程,让同一组线程服务更多请求。
用 HttpClient.GetAsync() 代替 HttpWebRequest.GetResponse() 用 EF Core 的 ToListAsync() 代替 ToList() Controller 方法标记为 async Task谨慎使用并行集合与无锁结构
高并发下频繁读写共享状态(如缓存、计数器)时,lock 容易成为热点。优先选用线程安全的内置类型:
ConcurrentDictionarycount++避免自己实现“轻量级锁”——.NET 的 Concurrent 类型已过充分压测
控制流量,别让系统被冲垮
并发高 ≠ 全盘接受所有请求。主动限流、降级、排队更可靠:
用 Microsoft.Extensions.Http.Resilience(.NET 7+)配置 RateLimiter 策略,按 IP 或用户限速 API 入口加 AspNetCore.RateLimiting 中间件(兼容 .NET 6) 非核心操作(如日志上报、埋点)改用 Fire-and-forget + Channel 缓冲,不阻塞主流程 对下游依赖(DB、第三方 API)设置超时与熔断(Polly 或内置 ResiliencePipeline)优化对象分配与 GC 压力
每秒万级请求下,高频 new 对象会触发频繁 Gen0 GC,造成 STW 延迟 spikes:
用 ArrayPool基本上就这些。高并发不是炫技,而是权衡:异步换吞吐,限流保稳定,复用减压力,结构避竞争。.NET 已经帮你铺好路,关键是别绕开它去造轮子。
