При отмене асинхронной операции.Бросить TaskCanceledException или просто вернуть? - PullRequest
0 голосов
/ 28 сентября 2018

При отмене асинхронной операции, когда я должен использовать это (просто вернуть):

if( ct.IsCancellationRequested) return;

вместо этого (сгенерировать исключение):

if( ct.IsCancellationRequested) throw new TaskCanceledException(task);

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Вряд ли вам нужно бросить TaskCanceledException.TaskCanceledException является результатом отмененной задачи, которая содержит CancellationToken, который соответствует токену в OperationCanceledException, выданном в асинхронной операции вашей задачи.

Из вашего фрагмента кода вы можете использовать:

ct.ThrowIfCancellationRequested

, в отличие от более многословного:

if (ct.IsCancellationRequested)
    throw new OperationCancelledException(ct);

Но неясно, в каком направлении в конечном итоге давать советы без дополнительного контекста.Существуют варианты использования асинхронных операций для тихой отмены / завершения или посредством OperationCancelledException отмены.

0 голосов
/ 28 сентября 2018

Создание исключения останавливает все выполнение в этом пути к коду, пока соответствующая перехват не обработает исключение.Это гарантирует код для остановки.Его остановка заключается в том, что вам приходится возвращаться несколько раз из различных методов, потенциально проверяя логические возвращаемые значения и создавая логику ветвления.Исключение просто останавливает все.

Выбор остается за вами и действительно зависит от сценария.

Вот некоторая документация Microsoft https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-cancellation

Одна вещьПримечательно, что они упомянули, что это

. Выдает исключение OperationCanceledException и передает ему токен, для которого было запрошено аннулирование.Предпочтительный способ сделать это - использовать метод ThrowIfCancellationRequested.Задача, отмененная таким образом, переходит в состояние Отменено, которое вызывающий код может использовать для проверки того, что задача ответила на запрос отмены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...