С# Таймер срабатывает до окончания интервалаC#

Место общения программистов C#
Ответить
Anonymous
 С# Таймер срабатывает до окончания интервала

Сообщение Anonymous »

Я использую System.Timers.Timer в C# для планирования задачи, которую необходимо выполнять каждые 5 секунд. Однако я заметил, что таймер иногда срабатывает до окончания интервала. Вот мой код:

Код: Выделить всё

internal class IcbDataProcessor : BackgroundService
{
private readonly ILogger _logger;
private readonly System.Timers.Timer _timer;
private readonly TimeSpan _interval = TimeSpan.FromSeconds(5);

public IcbDataProcessor(ILogger logger)
{
_logger = logger;
_timer = new System.Timers.Timer(_interval);
_timer.Elapsed += Timer_Elapsed;
}

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
var now = DateTime.Now;
var nextTime = RoundUp(now, _interval);
if (nextTime > now)
{
await Task.Delay(nextTime - now, stoppingToken);
}
_timer.Start();
}

private static DateTime? _prevRoundedTime;
private void Timer_Elapsed(object? sender, ElapsedEventArgs e)
{
try
{
var roundedTime = RoundDown(DateTime.Now, _interval);
if (roundedTime == _prevRoundedTime)
{
_logger.LogWarning("IcbDataProcessor: Prev Rounded Time is equals to Rounded Time: {Time}", roundedTime);
}

//To do
_prevRoundedTime = roundedTime;
}
catch (Exception ex)
{
_logger.LogError(ex, "DataProcessor EXCEPTION {Message}", ex.Message);
}
}

public override async Task StopAsync(CancellationToken cancellationToken)
{
_timer?.Dispose();
await Task.CompletedTask;
}

public static DateTime RoundUp(DateTime date, TimeSpan d)
{
return new DateTime((date.Ticks + d.Ticks - 1) / d.Ticks * d.Ticks, date.Kind);
}

public static DateTime RoundDown(DateTime date, TimeSpan d)
{
return new DateTime(date.Ticks / d.Ticks * d.Ticks, date.Kind);
}
}
Когда я проверяю сохраненное время, я вижу, что есть случаи, когда таймер запускается следующим образом: 10:10:25.001, 10:10:29.999 . Очевидно, что интервал между предыдущим и следующим экземпляром еще не составляет 5 секунд, что приводит к тому, что мое roundedTime округляется до того же числа. Я проверил и уверен, что мое событие завершается очень быстро (около 20 мс) и в моем коде нет ошибок.
Кто-нибудь знает, почему это происходит и как это исправить? Любые предложения приветствуются. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/784 ... erval-ends
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»