Я пытаюсь избежать любых исключений при отмене.
Ты не должен этого делать.
Бросок OperationCanceledException
- это идиоматический способ, которым «метод, который вы вызвали, был отменен», выражается в TPL. Не борись с этим - просто жди этого.
Это хорошая вещь, потому что это означает, что, когда у вас есть несколько операций, использующих один и тот же токен отмены, вам не нужно переполнять свой код на каждом уровне проверками, чтобы увидеть, действительно ли метод, который вы только что вызвали, действительно завершился нормально или был возвращен из-за отмены. Вы могли бы использовать CancellationToken.IsCancellationRequested
везде, но это сделает ваш код намного менее элегантным в долгосрочной перспективе.
Обратите внимание, что в вашем примере два фрагмента кода выдают исключение - один в самой задаче:
cancelToken.ThrowIfCancellationRequested()
и тот, где вы ожидаете завершения задания:
task.Wait(cancellationToken.Token);
Не думаю, что вы действительно хотите передать токен отмены в task.Wait
вызов, если честно ... это позволяет другому коду отменить ваше ожидание, Учитывая, что вы знаете, что только что отменили этот токен, бессмысленно - обязательна - выдавать исключение, независимо от того, заметила ли задача на самом деле отмену или нет. Опции:
- Используйте другой токен отмены (чтобы другой код мог отменить ваше ожидание независимо)
- Использовать тайм-аут
- Просто подождите столько, сколько потребуется