#c# #multithreading #task
#c# #многопоточность #задача
Вопрос:
У меня есть своего рода бесконечный цикл, в котором я выполняю некоторые операции. Я хотел бы иметь возможность отменить текущую операцию по определенной причине. Однако я не могу найти решение для отмены задачи с помощью paremetr.
private async void ProcessAsync()
{
while (true)
{
try
{
var result = await Task<object>.Run(async () =>
{
await Task.Delay(10000);
await Task.Delay(10000);
return new object();
}, _cts.Token);
}
catch (OperationCanceledException)
{
}
//catch (AnyOtherException)
//{
//
//}
}
}
Всякий раз, когда я хочу отменить задачу, я вызываю CancellationTokenSource.Метод Cancel(). Метод не принимает никаких аргументов. Все, что я могу сделать, это перехватить OperationCanceledException .
Это другой способ решить это или другой способ достичь того, чего я хочу?
Комментарии:
1.
async void
должен использоваться только в обработчиках событий. Что касается указания причины, это не связано с отменой задачи . Отмена — это просто отмена. Нет необходимости выбрасывать в случае отмены, вы можете просто вернуться из цикла. Причина — проблема, связанная с приложением / бизнесом2. PS, даже после редактирования,
async void
является очень серьезной ошибкой , которая, вероятно, приведет к досрочному завершению. Кто будет читать эту причину в любом случае? Сколько существует причин? Почему эта причина должна проходить через цикл, прежде чем она достигнет того, кто собирается ее прочитать?3. @PanagiotisKanavos Хорошо указывать на возможные проблемы в предлагаемом коде, но немного грубо подвергать сомнению причину чего-либо. Если есть несколько потоков, которые могут отменить эту задачу, это может быть просто удобочитаемое сообщение об ошибке, которое вы хотите показать. Вам, вероятно, не нужна причина для прохождения цикла, я полагаю, OP просто хочет, чтобы причина требовалась для отмены токена.
4. @miechooy: вы спрашиваете, как отменить
Task.Run
делегирование или как указать понятную для человека причину отмены?