0

0

c# 如何处理高并发

畫卷琴夢

畫卷琴夢

发布时间:2026-01-20 10:03:10

|

886人浏览过

|

来源于php中文网

原创

高并发需分任务类型、选对机制、避默认陷阱:用异步I/O替代同步阻塞,ValueTask减GC压力,ReaderWriterLockSlim优化读多写少,CPU密集任务控并行度,热点数据缓存+消息队列分流,压测须真实连接级。

c# 如何处理高并发

高并发不是“加线程就完事”,而是要分清任务类型、选对机制、避开默认陷阱。C# 里真正扛住万级 QPS 的系统,几乎从不靠 Thread.Start() 或盲目 Task.Run(),而是组合使用异步 I/O、并发集合、轻量同步和架构分流。

async/await 不是语法糖,是 I/O 并发的唯一正解

如果你还在用 dbContext.SaveChanges() 同步写数据库,或用 HttpClient.GetStringAsync().Result 等响应,那你的服务在 200 并发时就可能线程池饥饿、响应延迟飙升甚至死锁。

  • 所有外部调用(HTTP、DB、文件、Redis)必须走真正的异步 API:用 ToListAsync() 而非 ToLIst(),用 GetStreamAsync() 而非 GetResponse()
  • 绝不能在 async 方法里调用 .Wait().Result —— ASP.NET Core 中这会直接卡死请求上下文
  • 高频小响应(如鉴权、计数器)优先用 ValueTask 替代 Task,避免 GC 压力(比如每秒 10 万次 token 校验,ValueTask 可减少 30%+ 内存分配)
public async ValueTask IsUserActiveAsync(int userId)
{
    // ✅ 正确:异步查缓存 + 异步查 DB(必要时)
    var cached = await _cache.GetAsync($"user:active:{userId}");
    if (cached.HasValue) return cached.Value;
return await _db.Users
    .Where(u => u.Id == userId && u.Status == "Active")
    .AnyAsync();

}

别乱锁,先看是不是真需要“写”——读多写少场景用 ReaderWriterLockSlim

很多人一遇到并发就上 lock(obj),结果整个方法变成串行瓶颈。其实 80% 的共享状态是“读远多于写”,比如配置项、用户权限白名单、限流计数器。

开源电子商务系统(网店) iWebShop
开源电子商务系统(网店) iWebShop

iWebShop基于iWebSI框架开发,在获得iWebSI技术平台库支持的条件下,iWebShop可以轻松满足用户量级百万至千万级的大型电子商务网站的性能要求。站点的集群与分布式技术(分布式计算与存储/高可用性/负载均衡)被屏蔽在SI 平台之内,基于iWebShop并且按照SI平台库扩展规范开发的新增功能模块,也将同时获得这种超级计算与处理的能力。作为开源的LAMP电子商务系统,iWebShop

下载
  • lock 是排他锁,读操作也得排队;而 ReaderWriterLockSlim 允许多个读同时进行,只在写时阻塞全部读写
  • 注意:它不自动释放,必须配对 EnterReadLock()/ExitReadLock() 或用 using 模式(.NET 6+ 支持 using var _ = rwLock.EnterReadLock();
  • 如果只是计数累加,优先用 Interlocked.Increment(ref count) —— 零锁、原子、比 lock 快 5–10 倍

CPU 密集任务别扔进线程池,用 Parallel + 显式控制并发度

把图像压缩、JSON 解析、规则引擎计算这类 CPU 绑定任务丢进 Task.Run(),等于主动制造线程风暴。16 核机器跑 100 个 Task.Run(() => HeavyCalc()),结果是上下文切换压垮吞吐。

  • Parallel.ForEach(source, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }) 控制并行数
  • 大集合处理优先用 PLINQ:data.AsParallel().Where(...).Select(...).ToArray(),但注意它默认不保留顺序,且异常会包装成 AggregateException
  • 更重的任务(如批量报表生成)应剥离到后台服务 + 消息队列,Web 层只返回 “任务已提交,ID: xxx”,避免占用请求线程

单机扛不住?那就别硬扛——用分布式缓存 + 消息队列做“软性分流”

再优化的代码也抵不过一个没缓存的热点查询(比如首页 Banner),或一个同步发邮件的接口。高并发的本质不是“让单机更快”,而是“让不该在请求链路里做的事,根本不出现在链路里”。

  • 用户会话、商品详情、配置中心数据 → 全部进 Redis,设置合理过期时间,用 IDistributedCache 接口解耦
  • 订单创建后发短信、更新搜索索引、扣减库存 → 封装成消息,投递到 RabbitMQKafka,由独立消费者处理
  • 千万别在 HTTP 请求里直接 await _queue.PublishAsync(msg) 后等 ACK —— 改为 fire-and-forget(或至少设超时 100ms),失败由死信队列兜底

最常被忽略的一点:高并发问题往往不是出在“怎么写”,而是出在“怎么测”。本地用 HttpClient 循环发 1000 次请求 ≠ 真实并发 —— 缺少连接复用、TCP 拥塞、服务端队列积压都测不出来。上线前务必用 wrkhey 做真实连接级压测,并监控 ThreadPool.GetAvailableThreads() 和 GC 代龄分布。

相关专题

更多
rabbitmq和kafka有什么区别
rabbitmq和kafka有什么区别

rabbitmq和kafka的区别:1、语言与平台;2、消息传递模型;3、可靠性;4、性能与吞吐量;5、集群与负载均衡;6、消费模型;7、用途与场景;8、社区与生态系统;9、监控与管理;10、其他特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

201

2024.02.23

什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

325

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.10.07

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

412

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

310

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

75

2025.09.10

kafka消费者组有什么作用
kafka消费者组有什么作用

kafka消费者组的作用:1、负载均衡;2、容错性;3、广播模式;4、灵活性;5、自动故障转移和领导者选举;6、动态扩展性;7、顺序保证;8、数据压缩;9、事务性支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

167

2024.01.12

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

13

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号