У меня длительный, длинный интервал, процесс опроса. Мне нужно иметь возможность принудительно обновить и перезапустить опрос.
Самое очевидное, что пришло в голову, это отменить задачу опроса и запустить новую, так как первоначальный цикл всегда обновляется.
Я пытаюсь найти лучший способ сделать это, использование OperationCanceledException для управления потоком программы кажется мне странным, но, возможно, это правильный выбор? Вот что у меня есть на данный момент:
public void Start()
{
var previousDateTime = DateTime.MinValue;
CancellationTokenSource = new CancellationTokenSource();
CancellationToken = CancellationTokenSource.Token;
ASMTask = Task.Run(async () =>
{
try
{
while (!CancellationToken.IsCancellationRequested)
{
if (CheckForUpdate())
{
Update(previousDateTime);
}
await Task.Delay(PollingInterval * 1000, CancellationToken);
}
CancellationToken.ThrowIfCancellationRequested();
}
catch (OperationCanceledException oc)
{
Start();
}
}, CancellationToken);
}
public void ForceUpdate()
{
CancellationTokenSource.Cancel();
}
Также не знаете, как вызов Start() внутри задачи повлияет на ресурсы? Я предполагаю, что это нормально, поскольку новой задаче будет предоставлен поток для выполнения?
Я хотел сделать что-то вроде:
public void ForceUpdate()
{
CancellationTokenSource.Cancel();
ASMTask.WaitForCancellationComplete();
Start();
}
Но я не вижу способа дождаться завершения задачи путем отмены.
РЕДАКТИРОВАТЬ: RE - Дублирующий вопрос.
Принятый ответ на предыдущий вопрос заключался в использовании исключений так же, как я пытался избежать, однако оказалось, что второй ответ был полезен, но я не осознавал этого, пока не прочитал объяснение, предоставленное Мэттью Уотсон. Я рад, что это было закрыто как дубликат, хотя я не могу понять, как это сделать на самом деле!