Files
parr_api/PARR.BLL/Services/Implementations/IntervalService.cs

44 lines
1.7 KiB
C#

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