惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
博客园_首页
S
SegmentFault 最新的问题
罗磊的独立博客
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
D
Docker
雷峰网
雷峰网
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
V
V2EX
大猫的无限游戏
大猫的无限游戏
V
Visual Studio Blog
腾讯CDC
宝玉的分享
宝玉的分享
酷 壳 – CoolShell
酷 壳 – CoolShell
人人都是产品经理
人人都是产品经理
T
Tailwind CSS Blog
Vercel News
Vercel News
H
Help Net Security
博客园 - Franky
D
DataBreaches.Net
aimingoo的专栏
aimingoo的专栏

博客园 - Hey,Coder!

微信小程序 web方案实现调音器功能 systemctl slice配置docker最大占用cpu 内存 pipenv环境变量配置 .net8验证码 数据库差异对比工具 docker部署prometheus grafana pgexporter Alertmanager ubuntu24 换源 ssh配置 ubuntu24 Harbor部署 ubuntu24 kvm部署 cockpit web管理界面 .net api代理 Ubuntu 24.04 DMAR IOMMU 报错修复 uniapp iOS App 上架 vs文件软链接 Docker 网络别名 .net8通用中间件处理公共返回值结构 .net环境下OpenTelemetry Body 读取注意事项 jaeger界面显示异常 .net opentelemetry collector jaeger c# opentelemetry 自定义export c# opentelemetry 自定义export c# 生成对象的初始化代码 Elasticsearch ILM 与 Data Stream 概念及实例说明文档 portainer httphelper封装 Ocelot + Consul + SignalR 粘性会话 正交软件架构 docker postgresql17 主从复制 rabbitmq总结与c#示例 docker rabbitmq quartz dashboard
c# 信号量
Hey,Coder! · 2026-05-18 · via 博客园 - Hey,Coder!

信号量 SemaphoreSlim

系统预封装的控制同时允许访问资源的进程数量的相关逻辑,避免了重复编写相关逻辑

基础示例

        // 获取或创建信号量(最大并发数可从 JobDataMap 读取,此处设为 3)
        var semaphore =  new SemaphoreSlim(3, 3);
        
        if (!await semaphore.WaitAsync(TimeSpan.Zero))
        {
            // 信号量已满,本次不执行(可根据需求记录日志或重试)
            return;
        }
        
        try
        {
            // 执行核心逻辑
            await DoWork(context);
        }
        finally
        {
            semaphore.Release();
        }

多个相同资源需要控制时可以配置ConcurrentDictionary使用

    private static readonly ConcurrentDictionary<string, SemaphoreSlim> _semaphores = new();
 var jobKey = context.JobDetail.Key.ToString();
        // 获取或创建信号量(最大并发数可从 JobDataMap 读取,此处设为 3)
        var semaphore = _semaphores.GetOrAdd(jobKey, _ => new SemaphoreSlim(3, 3));
        
        if (!await semaphore.WaitAsync(TimeSpan.Zero))
        {
            // 信号量已满,本次不执行(可根据需求记录日志或重试)
            return;
        }
        
        try
        {
            // 执行核心逻辑
            await DoWork(context);
        }
        finally
        {
            semaphore.Release();
            // 可选:当 Job 被删除时清理信号量(需监听调度器事件)
        }