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}"); await intervalHandler.Invoke(); nextStart = nextStart.Add(interval); logger.LogInformation($"Следующая дата запуска: {nextStart}"); var intervalOffset = nextStart - DateTimeOffset.UtcNow; if (intervalOffset < TimeSpan.Zero) { intervalOffset = TimeSpan.Zero; logger.LogWarning($"Время следующего запуска изменено на сейчас. Так как рассчитанное время запуска меньше чем сейчас, {nextStart}<{DateTimeOffset.UtcNow}. " + $"Это произошло потому что время выполнения основного метода больше чем заданный интервал повторений."); } await Task.Delay(intervalOffset); } } } }