Итак, моему приложению необходимо выполнить действие почти непрерывно (с паузой в 10 секунд или около того между каждым прогоном) до тех пор, пока приложение запущено или требуется отмена. Работа, которую он должен выполнить, имеет возможность занять до 30 секунд.
Лучше ли использовать System.Timers.Timer и использовать AutoReset, чтобы убедиться, что он не выполнил действие до того, как завершился предыдущий "тик".
Или мне следует использовать общую задачу в режиме LongRunning с маркером отмены и иметь регулярный бесконечный цикл while внутри него, вызывающий действие, выполняющее работу с 10-секундной Thread.Sleep между вызовами? Что касается модели async/await, я не уверен, что это будет уместно здесь, поскольку у меня нет никаких возвращаемых значений из работы.
CancellationTokenSource wtoken;
Task task;
void StopWork()
{
wtoken.Cancel();
try
{
task.Wait();
} catch(AggregateException) { }
}
void StartWork()
{
wtoken = new CancellationTokenSource();
task = Task.Factory.StartNew(() =>
{
while (true)
{
wtoken.Token.ThrowIfCancellationRequested();
DoWork();
Thread.Sleep(10000);
}
}, wtoken, TaskCreationOptions.LongRunning);
}
void DoWork()
{
// Some work that takes up to 30 seconds but isn't returning anything.
}
или просто использовать простой таймер при использовании его свойства AutoReset и вызвать .Stop(), чтобы отменить его?