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