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 被删除时清理信号量(需监听调度器事件)
}
留待后查,同时方便他人
联系我:ivesbao@163.com
联系我:ivesbao@163.com

浙公网安备 33010602011771号