У меня есть метод, который создает некоторые задачи, а затем ожидает их выполнения с помощью WaitAll, прежде чем вернуться. Проблема в том, что если эти задачи были отменены, то WaitAll выдает AggregateException, содержащую множество TaskCanceledException s.
Это означает, что WaitAll будет вызывать исключения в двух разных случаях:
- Исключения, указывающие на настоящую ошибку. Это означает, что возникло состояние, с которым мы не знали, как справиться; они должны распространяться как необработанные исключения, пока они в конечном итоге не завершат процесс.
- Исключения, указывающие на то, что пользователь нажал кнопку "Отмена". Это означает, что задача была отменена и очищена, и программа должна продолжить работу в обычном режиме.
Последнее полностью вписывается в определение досадного исключения: это исключение, возникшее в совершенно неисключительных обстоятельствах, поэтому я должен его перехватить, чтобы возобновить нормальный поток управления. К счастью, поймать его легко, правда? Просто добавьте catch (AggregateException)
и - подождите, это тот же тип, который выдается при фатальной ошибке.
Мне нужно дождаться завершения выполнения задач, прежде чем я вернусь (мне нужно знать, что они больше не используют свои подключения к базе данных, дескрипторы файлов или что-то еще), поэтому мне нужен WaitAll или что-то подобное. И если какая-либо из задач не удалась, я действительно хочу, чтобы эти исключения распространялись как необработанные исключения. Я просто не хочу исключений для отмены.
Как я могу предотвратить WaitAll
создание исключений для отмененных задач?