Нужно регулярно обновлять данные в фоне, но не хочется запускать второй обход поверх первого? С PeriodicTimer можно построить один последовательный async-цикл.
using var timer = new PeriodicTimer(
TimeSpan.FromSeconds(10));
while (await timer.WaitForNextTickAsync(stoppingToken))
{
await RefreshAsync(stoppingToken);
}
Пока RefreshAsync не закончится, следующая итерация этого цикла не начнётся. Но это не то же самое, что «десять секунд отдыха после каждой работы».
⏬ Что случится с пропущенными тиками?
Таймер объединяет несколько тиков, пришедших между ожиданиями, в один. Если обновление заняло 25 секунд, не появится очередь из всех пропущенных запусков. Следующее ожидание может завершиться сразу.
У таймера должен быть один потребитель. Отмена ожидания через токен приводит к OperationCanceledException — её нужно учитывать при остановке фонового сервиса.
🔗 Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#il_люминатор