C#如何处理高并发请求 C#高并发编程技巧

高并发核心是合理运用异步、限流、资源复用与无锁结构。.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,支持高并发读写
  • ConcurrentQueueChannel:用于生产者-消费者场景(如后台任务队列)
  • 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 减少堆分配
  • 避免在循环/热路径中字符串拼接,改用 StringBuilderstring.Create()
  • 启用 GC.TryStartNoGCRegion()(谨慎!仅适用于已知大小的短时峰值)

基本上就这些。高并发不是炫技,而是权衡:异步换吞吐,限流保稳定,复用减压力,结构避竞争。.NET 已经帮你铺好路,关键是别绕开它去造轮子。