c# 信号量

信号量 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 被删除时清理信号量(需监听调度器事件)
        }
posted @ 2026-05-18 17:51  Hey,Coder!  阅读(14)  评论(0)    收藏  举报