Отменить задачу с параметром

#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 делегирование или как указать понятную для человека причину отмены?