[英]Hangfire RecurringJob synchronized with the clock
我正在嘗試將Hangfire定期作業與時鍾同步。 基本上,我想在下一個小時開始,然后在每個小時開始一個周期性工作。
例如:如果當前時間是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);
}
在這一行代碼中,您總是要增加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:01
至09:59
將舍入為10:00
。 聽起來這就是您要的行為。
您可能還需要在HangFire文檔中閱讀有關SchedulePollingInterval
,這可能會影響您的結果。
使用cron表達式有更好的方法。 如果您打開https://crontab.guru並嘗試一些表達式,您將找到每個表達式的解釋。
cron表達式的一些示例:
0/5 * * * *
。 如果當前時間是11:12 PM,它將在11:15 PM然后在11:20 PM執行一個方法,依此類推。
0 * * * *
。 如果當前時間是11:12 PM,它將在00:00 AM,01:00 AM,02:00 AM等執行一個方法
除了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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.