如何让Hangfire作业调度程序错开20分钟的间隔作业

时间:2016-08-16 14:50:42

标签: c# cron scheduled-tasks hangfire

我需要每20分钟运行一些任务。我可以使用cron表达式RecurringJob.AddOrUpdate(() => /* my method */, "*/20 * * * *")

在Hangfire中实现此目的

问题是,我的所有任务最终都会在同一时间运行,例如00:00,00:20,00:40,01:00

有没有人知道如何在不实施某种人工干预的情况下错开20分钟的间隔任务?

我希望Hangfire能够在我创建它们的20分钟内完成这些工作,没有什么特别之处:)

2 个答案:

答案 0 :(得分:1)

我试试这个:首先,修改你的添加或更新以指定一个工作ID:

RecurringJob.AddOrUpdate("some-id", () => /* my method */, "*/20 * * * *");

接着是

RecurringJob.Trigger("some-id");

To run a recurring job now, call the Trigger method.

更新:如果延迟工作而不是重复工作怎么样?你的“我的方法”在最后创建一个新的延迟作业(递归),设置为在20分钟后运行。您仍将使用Trigger方法进行首次运行。

答案 1 :(得分:0)

一种实现这一目标的“骇客”方法是设置small number of workers

app.UseHangfire(config =>
{
    config.UseServer(2);
});

// or
var server = new BackgroundJobServer(2);

您是否看着这个说“哦,太好了!”或“那是一个糟糕的主意”将完全取决于您自己使用Hangfire的方式。如果您一个小时或每15分钟只运行几件事情,而您发现它们彼此在“相互踩踏”,那么这可能是一个简单的解决方案。

第二种方法:您可以创建一个异步任务并运行await Task.Delay(TimeSpan.FromSeconds(10))来短暂延迟。这很可能会导致您的应用关闭速度更慢,因为它会认为您仍在运行任务。因此,我仅在紧急情况下使用此功能,或者您对后果不承担任何责任。

希望Hangfire在某个时候能够以更有条理的方式支持这一点。