C产品如何满足特定用户需求?
- 内容介绍
- 文章标签
- 相关推荐
本文共计859个文字,预计阅读时间需要4分钟。
SemaphoreSlim 限制并发访问,确保线程安全。适用于控制对共享资源的访问,防止竞态条件。
为什么不能在方法里 new SemaphoreSlim(5)
每次调用都新建实例 → 每个请求拿到的都是全新信号量,初始许可数全是 5,完全不共享计数。限流形同虚设。
常见表现:压测时并发数轻松突破设定值,日志里看到几十个请求同时打下游。
正确做法:
- ASP.NET Core 中注册为
Singleton:services.AddSingleton(new SemaphoreSlim(5, 5)) - 或声明为
private static readonly SemaphoreSlim _sem = new SemaphoreSlim(5, 5) - 绝对不要写成
var sem = new SemaphoreSlim(5)放在方法体或using块里
WaitAsync() 后 Release() 必须写在 finally 里
这是线上最常导致服务卡死的点:一次 Release() 漏掉,许可计数就永久少 1;漏三次,第 4 个请求开始永远 WaitAsync() 挂起。
本文共计859个文字,预计阅读时间需要4分钟。
SemaphoreSlim 限制并发访问,确保线程安全。适用于控制对共享资源的访问,防止竞态条件。
为什么不能在方法里 new SemaphoreSlim(5)
每次调用都新建实例 → 每个请求拿到的都是全新信号量,初始许可数全是 5,完全不共享计数。限流形同虚设。
常见表现:压测时并发数轻松突破设定值,日志里看到几十个请求同时打下游。
正确做法:
- ASP.NET Core 中注册为
Singleton:services.AddSingleton(new SemaphoreSlim(5, 5)) - 或声明为
private static readonly SemaphoreSlim _sem = new SemaphoreSlim(5, 5) - 绝对不要写成
var sem = new SemaphoreSlim(5)放在方法体或using块里
WaitAsync() 后 Release() 必须写在 finally 里
这是线上最常导致服务卡死的点:一次 Release() 漏掉,许可计数就永久少 1;漏三次,第 4 个请求开始永远 WaitAsync() 挂起。

