Как предложили @Hans и @CodeInChaos, я обнаружил, что единственный способ сбросить необработанное исключение (таким образом убивая процесс) - принудительно запустить финализатор ( Примечание : убедитесь, что вы не делаете это в ContinueWith()
!):
GC.Collect();
GC.WaitForPendingFinalizers();
В моих конкретных обстоятельствах Задача не была собрана сборщиком мусора, потому что выполнение программы зависело от успеха Задачи. Без продолжения потока мое приложение не сделало бы ничего, чтобы вызвать сборщик мусора (выделение объектов и т. Д.).
Интересно то, что даже GC.Collect()
недостаточно. Финализатор задач все еще не запущен. GC.WaitForPendingFinalizers()
должен был быть вызван явно. (Я подозреваю, что не понимаю тонкостей, связанных с финализацией).
Подводя итог: Не ожидайте, что поведение Задачи TPL * * * * * * не будет наблюдаться как поведение других потоков Необработанное исключение Поведение (например, QueueUserWorkItem
). В большинстве практических ситуаций вам необходимо выполнить проверку на предмет исключений из задач: вы не можете полагаться на ненаблюдаемые исключения, предлагаемые вашему вниманию, так же, как и в случае с QUWI или аналогичными, потому что вы будете видеть их только в финализаторе, который абсолютно непредсказуем.
Редактировать: см. Мой другой ответ относительно .NET 4.5