如何按时启动我的 Worker Service

Zip*_*ppy 5 c# background-service .net-6.0

我有这个工作人员服务来启动工作,但它每小时检查一次工作。我怎样才能让它按小时而不是每小时运行时间检查?

public class WorkerService : BackgroundService
{
    private const int generalDelay = 20;  //minutes

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            await Task.Delay(generalDelay * 60000, stoppingToken);
            await DoBackupAsync();
        }
    }

    private static Task DoBackupAsync()
    {
        DoWork d = new DoWork();
        return Task.FromResult("Done");
    }
}
Run Code Online (Sandbox Code Playgroud)

主要是为了这个,我知道作业何时运行,并且可以预测并安排在运行时间之间以及所有作业是否完成时的更新。

Ste*_*ary 8

对于这种需求,成熟的调度程序可能有点大材小用。我确实建议使用 cron 表达式,但我更喜欢Cronos而不是 NCrontab。Cronos 在 UTC 和夏令时转换方面拥有更好的测试和明确定义的行为。

这就是使用 Cronos 的样子:

public class WorkerService : BackgroundService
{
  private const string schedule = "0 * * * *"; // every hour
  private readonly CronExpression _cron;

  public WorkerService()
  {
    _cron = CronExpression.Parse(schedule);
  }

  protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  {
    while (!stoppingToken.IsCancellationRequested)
    {
      var utcNow = DateTime.UtcNow;
      var nextUtc = _cron.GetNextOccurrence(utcNow);
      await Task.Delay(nextUtc.Value - utcNow, stoppingToken);
      await DoBackupAsync();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)