You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# .NET Core 3.1 SemaphoreSlim多线程及超时功能使用问题排查

问题根因

首先明确SemaphoreSlim构造函数两个入参的定义:

  • 第一个参数initialCount:初始化阶段可同时分配的许可数量
  • 第二个参数maxCount:允许分配的许可数量的最大上限,仅作为阈值限制,不会自动将初始许可数提升到最大上限

你最初使用的new SemaphoreSlim(1, 5)存在核心逻辑错误:

  1. 初始仅分配了1个可用许可,虽然最大上限设为5,但你没有主动调用Release()额外新增许可(最多可新增4个)的逻辑,实际运行过程中可用许可数永远最多为1,所以同一时间始终只有1个请求能进入下游逻辑,永远达不到你预期的5并行效果,符合你观测到的下游组件最多被调用1次的现象。
  2. 你看到_lockGuard.CurrentCount始终为0的原因:仅有的1个许可会被第一个请求占用,许可数直接降为0,后续请求全部进入等待队列;当前请求处理完成释放1个许可,会立刻被等待队列里的下一个请求取走,所以你观测到的许可数大部分时间都是0,不会出现1~5的波动。

解决方案

如你补充的方案,直接将初始化代码改为new SemaphoreSlim(5, 5)即可:
初始就分配5个可用许可,最大上限也设为5,这样同一时间最多允许5个请求并行访问下游Thrift服务,超过5个的请求会进入等待队列,等待超过_millisecondsThriftTimeout阈值后就会触发超时返回失败,完全匹配你的业务需求。

内容的提问来源于stack exchange,提问作者EricBDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 00:54:04