using Microsoft.Extensions.Logging; using PARR.BLL.Services.Interfaces; namespace PARR.BLL.Services.Implementations { internal class IntervalService : IIntervalService { private readonly ILogger logger; public IntervalService(ILogger logger) { this.logger = logger; } public async Task IntervalInitAsync(IntervalHandlerDelegate intervalHandler, TimeSpan interval) { var nextStart = DateTimeOffset.UtcNow; while (true) { nextStart = DateTimeOffset.UtcNow; logger.LogInformation("Запуск по расписанию. Интервал: {interval}, дата: {nextStart}", interval, nextStart); await intervalHandler.Invoke(); nextStart = nextStart.Add(interval); logger.LogInformation("Следующая дата запуска: {nextStart}. Интервал: {interval}.", nextStart, interval); var intervalOffset = nextStart - DateTimeOffset.UtcNow; if (intervalOffset < TimeSpan.Zero) { intervalOffset = TimeSpan.Zero; logger.LogWarning("Время следующего запуска изменено на сейчас. Так как рассчитанное время запуска меньше чем сейчас, {nextStart}<{now}. " + $"Это произошло потому что время выполнения основного метода больше чем заданный интервал повторений.", nextStart, DateTimeOffset.UtcNow); } await Task.Delay(intervalOffset); } } } }