【问题标题】:How to run only one job concurrently?如何同时只运行一项工作?
【发布时间】:2016-07-20 14:41:24
【问题描述】:

我有一台具有约 50 个重复作业的 hangfire 服务器。在 IIS 上设置 Hangfire,如 this example。 像这样在 startup.cs 中添加到 hangfire 的重复作业:

RecurringJob.AddOrUpdate(job.desctiprion,
            () => job.startJob(), 
            job.cron, 
            TimeZoneInfo.Local);

我需要添加每分钟运行的新重复作业。但是这项工作几乎不可能运行更长的时间。我的目标 - 提供同时工作的只是这个工作的一个例子。

有哪些解决方案?据我了解,需要一个线程队列,但队列不支持线程设置。

【问题讨论】:

  • 目前尚不清楚您要做什么,“只有一个”和“同时”似乎并没有真正结合在一起。这:只提供一个同时工作的工作示例没有任何意义。你能澄清一下吗?
  • 所以你只是想确保这项工作不会与自身重叠?
  • 我需要避免在某一时刻有多个此重复作业实例正在处理中的情况。是的,我只是想确保这项工作不会与自身重叠。例如:第一个作业在 17:00 运行,此运行需要 2 分 30 秒。我需要避免在 17:01 和 17:02 运行作业,但在 17:03 运行作业。我知道我可以使用数据库中的任何标志来验证作业是否正在运行。但或许在 Hangfire 中对这种情况有一个简单而正确的解决方案。

标签: c# hangfire


【解决方案1】:

您可以使用DisableConcurrentExecution 过滤器来防止并发执行。

[DisableConcurrentExecution(timeoutInSeconds: 60)]
public void SomeJob()
{
  //method body
}

此过滤器在方法的开头放置一个分布式锁 性能并在使用完成后发布它 IServerFilter 接口。类型和方法名称被用作 锁定资源。每个存储使用自己的分布式锁 执行。 (read more here)

【讨论】:

  • 谢谢,你的回答很有帮助。也可以使用 [AutomaticRetry(Attempts = 0)] 来避免重试中的大量作业。
【解决方案2】:
 var worker = new BackgroundWorker();
 worker.DoWork += worker_DoWork;
 worker.RunWorkerCompleted += worker_RunWorkerCompleted;
 private void worker_DoWork(object sender, DoWorkEventArgs e)
 {
        // do your task here
 }
 private void worker_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
 {

       //Do when completed 
 }

【讨论】:

  • 您的答案与 OP 的要求不同。他正在使用hangfire 进行后台作业处理。为此目的使用BackgroundWorked 将是完全不同的事情。
猜你喜欢
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2020-04-21
  • 2022-01-22
  • 1970-01-01
  • 2019-05-26
相关资源
最近更新 更多