C# .NET Core 3.1 SemaphoreSlim多线程及超时功能使用问题排查
问题根因
首先明确SemaphoreSlim构造函数两个入参的定义:
- 第一个参数
initialCount:初始化阶段可同时分配的许可数量 - 第二个参数
maxCount:允许分配的许可数量的最大上限,仅作为阈值限制,不会自动将初始许可数提升到最大上限
你最初使用的new SemaphoreSlim(1, 5)存在核心逻辑错误:
- 初始仅分配了1个可用许可,虽然最大上限设为5,但你没有主动调用
Release()额外新增许可(最多可新增4个)的逻辑,实际运行过程中可用许可数永远最多为1,所以同一时间始终只有1个请求能进入下游逻辑,永远达不到你预期的5并行效果,符合你观测到的下游组件最多被调用1次的现象。 - 你看到
_lockGuard.CurrentCount始终为0的原因:仅有的1个许可会被第一个请求占用,许可数直接降为0,后续请求全部进入等待队列;当前请求处理完成释放1个许可,会立刻被等待队列里的下一个请求取走,所以你观测到的许可数大部分时间都是0,不会出现1~5的波动。
解决方案
如你补充的方案,直接将初始化代码改为new SemaphoreSlim(5, 5)即可:
初始就分配5个可用许可,最大上限也设为5,这样同一时间最多允许5个请求并行访问下游Thrift服务,超过5个的请求会进入等待队列,等待超过_millisecondsThriftTimeout阈值后就会触发超时返回失败,完全匹配你的业务需求。
内容的提问来源于stack exchange,提问作者EricBDev
相关产品推荐
相关产品推荐

