高并发核心是合理运用异步、限流、资源复用与无锁结构。.NET 6+ 提供 async/await、Concurrent 集合、ResiliencePipeline 等特性,应避免同步阻塞、手动锁和高频堆分配。

处理高并发请求,核心不是“拼命加线程”,而是合理利用异步、非阻塞、限流和资源复用。C#(尤其是 .NET 6+)已内置大量高并发友好特性,关键在于用对地方。
用 async/await 替代同步阻塞调用
数据库查询、HTTP 调用、文件读写等 I/O 操作是并发瓶颈主因。同步等待会独占线程,线程池迅速耗尽。改用异步 API 可释放线程,让同一组线程服务更多请求。
- 用 HttpClient.GetAsync() 代替 HttpWebRequest.GetResponse()
- 用 EF Core 的 ToListAsync() 代替 ToList()
- Controller 方法标记为 async Task
,内部全程 await - 避免在 async 方法中调用 .Result 或 .Wait() —— 会死锁或线程饥饿
谨慎使用并行集合与无锁结构
高并发下频繁读写共享状态(如缓存、计数器)时,lock 容易成为热点。优先选用线程安全的内置类型:
-
ConcurrentDictionary
:替代 Dictionary + lock,支持高并发读写 -
ConcurrentQueue
或 Channel :用于生产者-消费者场景(如后台任务队列) -
AtomicInteger 类似物?用 Interlocked.Increment(ref count) 替代
count++ - 避免自己实现“轻量级锁”——.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
.Shared.Rent() 复用缓冲区,尤其处理 JSON/Stream - DTO 类尽量用 record struct(.NET 7+)或 readonly struct 减少堆分配
- 避免在循环/热路径中字符串拼接,改用 StringBuilder 或 string.Create()
- 启用 GC.TryStartNoGCRegion()(谨慎!仅适用于已知大小的短时峰值)
基本上就这些。高并发不是炫技,而是权衡:异步换吞吐,限流保稳定,复用减压力,结构避竞争。.NET 已经帮你铺好路,关键是别绕开它去造轮子。











