


























系统预封装的控制同时允许访问资源的进程数量的相关逻辑,避免了重复编写相关逻辑
// 获取或创建信号量(最大并发数可从 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 被删除时清理信号量(需监听调度器事件)
}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。