我在试着把韩火循环的任务和时钟同步。基本上,我希望有一个经常性的工作,从下一个小时开始,然后在每一个小时。
示例:如果当前时间是9:04 PM,则重复作业应如下所示: 10:00 PM -> 11:00 PM,00:00 AM,01:00 AM,02:00 AM,等等。
它类似于我之前的问题:C#计时器在每一个圆角时间上滴答作响(字面意思),但使用的是Hangfire。
在下面的代码中,我试图首先为下一小时剩下的几分钟调度一个BackgroundJob,然后在执行BackgroundJob后的每一个小时调度一个RecurringJob。问题是它在随机的时间滴答作响。
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);
}发布于 2019-08-15 19:17:11
在这一行代码中,您总是要添加60分钟。
result.AddMinutes(((now.Minute / 60) + 1) * 60)这是因为Minute属性只能在0到59之间,因此可以简化为:
result.AddMinutes((0 + 1) * 60)
result.AddMinutes(1 * 60)
result.AddMinutes(60)试一试:
result.AddMinutes((60 - (now.Minute % 60)) % 60)例如,09:00将以09:00的形式出现,但是通过09:59的09:01将聚集到10:00。听起来这就是你想要的行为。
您还可能希望阅读在HangFire文档中有关SchedulePollingInterval的内容,这可能会影响您的结果。
发布于 2019-08-15 20:08:26
使用cron表达式有更好的方法来做到这一点。如果您打开https://crontab.guru并尝试一些表达式,您将为每个表达式找到一个解释。
以下是cron表达式的几个例子:
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()。
下面给出了示例代码:
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);https://stackoverflow.com/questions/57514327
复制相似问题