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

Hangfire禁止同一作业多实例同时运行问题排查

阻止Hangfire同一作业同时运行多个实例

我有一个配置了Hangfire(v1.8.7)的ASP.NET Core MVC 8 Web应用,用于执行多个作业。偶尔某个作业会超出指定时间,进而触发另一个实例。我的目标是阻止Hangfire同时启动同一作业的多个实例。

我仅运行了一个服务器

我尝试使用DisableConcurrentExecution属性,但并未生效。

作业配置代码

[DisableConcurrentExecution(timeoutInSeconds: (3600))]
public ActionResult SetScheduledJob_SyncModifiedItemsFromAffiliateBox()
{
    RecurringJob.AddOrUpdate("SyncModifiedItemsFromAffiliateBox_OffHours", () => 
        SyncModifiedItemsFromAffiliateBoxJob(), Cron.Minutely());

    return RedirectToAction("index");
}

public void SyncModifiedItemsFromAffiliateBoxJob()
{
    Thread.Sleep(2 * 60 * 1000);
}

Program.cs配置代码

// Add Hangfire services.
builder.Services.AddHangfire(configuration => configuration
    .SetDataCompatibilityLevel(CompatibilityLevel.Version_180)
    .UseSimpleAssemblyNameTypeSerializer()
    .UseRecommendedSerializerSettings()
    .UseSqlServerStorage(appSettings.GetConnectionString("HangfireConnection")));

// Add the processing server as IHostedService
builder.Services.AddHangfireServer();
app.UseHangfireDashboard();
app.MapHangfireDashboard();

问题原因及解决办法

你把DisableConcurrentExecution属性加错了位置——它应该作用在实际执行的作业方法上,而不是用来添加定时任务的调度方法上。Hangfire的并发控制属性需要绑定到真正运行业务逻辑的方法,也就是SyncModifiedItemsFromAffiliateBoxJob,而非SetScheduledJob_SyncModifiedItemsFromAffiliateBox。

修改后的代码如下:

public ActionResult SetScheduledJob_SyncModifiedItemsFromAffiliateBox()
{
    RecurringJob.AddOrUpdate("SyncModifiedItemsFromAffiliateBox_OffHours", () => 
        SyncModifiedItemsFromAffiliateBoxJob(), Cron.Minutely());

    return RedirectToAction("index");
}

[DisableConcurrentExecution(timeoutInSeconds: 3600)]
public void SyncModifiedItemsFromAffiliateBoxJob()
{
    Thread.Sleep(2 * 60 * 1000);
}

额外优化建议:

  • 若想彻底避免作业重叠,可在添加定时任务时指定MisfireHandlingMode.IgnoreNew,这样当作业仍在运行时,新的触发请求会直接被忽略,不会进入等待队列:
    RecurringJob.AddOrUpdate(
        "SyncModifiedItemsFromAffiliateBox_OffHours", 
        () => SyncModifiedItemsFromAffiliateBoxJob(), 
        Cron.Minutely(),
        misfireHandlingMode: MisfireHandlingMode.IgnoreNew);
    
  • 单服务器场景下,上述配置已足够保证并发控制;后续若扩展多服务器,该属性也能跨服务器生效,阻止同一作业同时执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 14:21:03