44 lines
1.8 KiB
C#
44 lines
1.8 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}", 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);
|
|
}
|
|
}
|
|
}
|
|
}
|