簡體   English   中英

Hangfire RecurringJob與時鍾同步

[英]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:0109:59將舍入為10:00 聽起來這就是您要的行為。

您可能還需要在HangFire文檔中閱讀有關SchedulePollingInterval ,這可能會影響您的結果。

使用cron表達式有更好的方法。 如果您打開https://crontab.guru並嘗試一些表達式,您將找到每個表達式的解釋。

cron表達式的一些示例:

  • 每5分鍾: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM