首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hangfire RecurringJob与时钟同步

Hangfire RecurringJob与时钟同步
EN

Stack Overflow用户
提问于 2019-08-15 18:19:45
回答 2查看 1.8K关注 0票数 0

我在试着把韩火循环的任务和时钟同步。基本上,我希望有一个经常性的工作,从下一个小时开始,然后在每一个小时。

示例:如果当前时间是9:04 PM,则重复作业应如下所示: 10:00 PM -> 11:00 PM,00:00 AM,01:00 AM,02:00 AM,等等。

它类似于我之前的问题:C#计时器在每一个圆角时间上滴答作响(字面意思),但使用的是Hangfire。

在下面的代码中,我试图首先为下一小时剩下的几分钟调度一个BackgroundJob,然后在执行BackgroundJob后的每一个小时调度一个RecurringJob。问题是它在随机的时间滴答作响。

代码语言:javascript
复制
private DateTime RoundCurrentToNextOneHour()
{
    DateTime now = DateTime.Now, result = new DateTime(now.Year, now.Month, now.Day, now.Hour, 0, 0);
    return result.AddMinutes(((now.Minute / 60) + 1) * 60);
}

public Task StartAsync(CancellationToken cancellationToken)
{
    _logger.LogInformation("Timed Background Service is starting.");

    BackgroundJob.Schedule(() => StartRecurringJob(), RoundCurrentToNextOneHour());

    return Task.CompletedTask;
}

public void StartRecurringJob()
{
    RecurringJob.AddOrUpdate(() => DoWork(), Cron.Hourly, TimeZoneInfo.Local);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-15 19:17:11

在这一行代码中,您总是要添加60分钟。

代码语言:javascript
复制
result.AddMinutes(((now.Minute / 60) + 1) * 60)

这是因为Minute属性只能在0到59之间,因此可以简化为:

代码语言:javascript
复制
result.AddMinutes((0 + 1) * 60)
result.AddMinutes(1 * 60)
result.AddMinutes(60)

试一试:

代码语言:javascript
复制
result.AddMinutes((60 - (now.Minute % 60)) % 60)

例如,09:00将以09:00的形式出现,但是通过09:5909:01将聚集到10:00。听起来这就是你想要的行为。

您还可能希望阅读在HangFire文档中有关SchedulePollingInterval的内容,这可能会影响您的结果。

票数 0
EN

Stack Overflow用户

发布于 2019-08-15 20:08:26

使用cron表达式有更好的方法来做到这一点。如果您打开https://crontab.guru并尝试一些表达式,您将为每个表达式找到一个解释。

以下是cron表达式的几个例子:

  • 每5分钟:0/5 * * * *

如果当前时间是晚上11:12,那么它将在晚上11:15执行一个方法,然后在晚上11:20执行一个方法等等。

  • 每小时都有0 * * * *

如果当前时间是晚上11:12,它将在上午00:00、01:00、02:00等执行一个方法。

除了cron表达式,还有内置cron表达式。他们的源代码在这里:https://github.com/HangfireIO/Hangfire/blob/9cd09f38fa97e4c2dd48f6097985fd2b48b4568e/src/Hangfire.Core/Cron.cs#L231。如果我想每1小时做一些动作,那就是Cron.Hourly()

下面给出了示例代码:

代码语言:javascript
复制
RecurringJobManager manager = new RecurringJobManager();
manager.RemoveIfExists("myjob");

// Each 5 minutes, e.g. 01:05 pm, 01:10 pm, 01:15 pm, etc.
//manager.AddOrUpdate("myjob", Job.FromExpression(() => DoWork()), $"0/5 * * * *", TimeZoneInfo.Local);

// Each 1 hour, e.g. 01:00 pm, 02:00, 03:00 pm, etc.
manager.AddOrUpdate("myjob", Job.FromExpression(() => DoWork()), $"0 * * * *", TimeZoneInfo.Local);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57514327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档