我有许多任务需要每20分钟运行一次。我可以使用cron表达式RecurringJob.AddOrUpdate(() => /* my method */, "*/20 * * * *")
在Hangfire中实现这一点
问题是,我的所有任务最终都会在同一时间运行,例如00:00,00:20,00:40,01:00
有没有人知道如何在不实施某种人工干预的情况下错开一个20分钟的间隔任务?
我喜欢Hangfire从创建它们开始每隔20分钟运行一次这些工作,没有什么特别的:)
我试试这个:首先,修改你的添加或更新以指定一个工作ID:
RecurringJob.AddOrUpdate("some-id", () => /* my method */, "*/20 * * * *");
其次是
RecurringJob.Trigger("some-id");
To run a recurring job now, call the Trigger method.
更新:如果延迟工作而不是重复工作怎么样?你的“我的方法”在最后创建一个新的延迟作业(递归),设置为在20分钟后运行。您仍将使用Trigger方法进行首次运行。
实现这一目标的一个'hacky'方法是设置一个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在某些时候能够以更有条理的方式支持这一点。