Как я могу ожидать выполнения задач, не выбрасывая TaskCanceledExceptions?

У меня есть метод, который создает некоторые задачи, а затем ожидает их с WaitAll перед возвратом. Проблема в том, что если эти задачи были отменены, то WaitAll генерирует исключение AggregateException , содержащее множество TaskCanceledException s.

Это означает, что WaitAll будет вызывать исключения в двух разных случаях:

  • Исключения, указывающие на настоящую ошибку. Это означает, что было условие, с которым мы не знали, как справиться; они должны распространяться как необработанные исключения, пока они в конечном итоге не завершат процесс.
  • Исключения, указывающие на то, что пользователь нажал кнопку «Отмена». Это означает, что задача была отменена и очищена, и программа должна продолжить работу в обычном режиме.

Последнее полностью вписывается в определение неприятного исключения : это исключение, возникшее в совершенно неисключительных обстоятельствах, поэтому я должен его перехватить, чтобы возобновить нормальный поток управления. К счастью, поймать его легко, правда? Просто добавьте catch (AggregateException) и - подождите, это тот же тип, который выдается при фатальной ошибке.

Мне нужно дождаться завершения выполнения задач, прежде чем я вернусь (мне нужно знать, что они больше не используют свои соединения с базами данных, дескрипторы файлов или что-то еще), поэтому мне нужен WaitAll или что-то подобное . И если какая-либо из задач не удалась, я действительно хочу, чтобы эти исключения распространялись как необработанные исключения. Я просто не хочу исключений для отмены.

Как я могу запретить WaitAll генерировать исключения для отмененных задач?

23
задан Joe White 30 December 2011 в 16:25
поделиться