Мне нужно создать сервис, который будет работать теоретически навсегда.
Во время работы он должен будет проверять локальный кэш раз в пару секунд, и если он находит новые элементы в этом кеше, он должен создать и выполнить новый Task
для каждого нового элемента .
Мой вопрос: каков хороший подход к внедрению такого сервиса? Моя главная задача - как мне запускать асинхронные задачи по времени.
Я придумал два способа сделать это
Используйте System.Timers.Timer
для отправки событий, а затем запускайте код при возникновении события
Создайте метод, который будет вызывать себя, используя Task.Delay
Вот несколько примеров того, что я имею в виду под этими двумя методами:
Таймер
public void Run()
{
System.Timers.Timer timer = new System.Timers.Timer(TimeSpan.FromSeconds(2).TotalMilliseconds);
CancellationTokenSource ts = new CancellationTokenSource();
timer.Elapsed += async (sender, argz) => await CodeExecutor(ts.Token);
timer.Start();
}
public async Task CodeExecutor(CancellationToken token)
{
//Some logic
}
Task.Delay
private async Task RepeatableMethod(CancellationToken cancellationToken)
{
try
{
//some logic
}
catch (Exception e)
{
}
finally
{
await Task.Delay(TimeSpan.FromSeconds(2), cancellationToken)
.ContinueWith(_ => RepeatableMethod(cancellationToken),cancellationToken);
}
}
Я не уверен, какой метод лучше соответствует моему сценарию, и если нет другого способа, который был бы даже лучше, чем эти два. Моя главная проблема заключается в том, что я хочу, чтобы логика, которую я выполняю каждые 2 секунды, была асинхронной и, возможно, параллельной.
Что будет считаться лучшим подходом в следующем сценарии, и есть ли другой (хороший) способ, которым я могу подойти к своему делу?