Исключение (исключения) задачи не наблюдалось ни при ожидании задачи, ни при доступе к ее свойству Exception. В результате необнаруженное исключение было

Что это значит и как его решить?

Я использую задачи TPL.

Вся ошибка

Исключение (исключения) задачи не наблюдалось ни при ожидании задачи, ни при доступе к ее свойству Exception. В результате незаметное исключение было восстановлено streamом финализатора.

в System.Threading.Tasks.TaskExceptionHolder.Finalize ()

mscorlib

Если вы создаете задачу и вы никогда не вызываете task.Wait() или пытаетесь получить результат Task , когда задача собирается сборщиком мусора, она будет разорвать ваше приложение во время финализации. Подробнее см. На странице MSDN об обработке исключений в TPL .

Лучший вариант здесь – «обработать» исключение. Это можно сделать с помощью продолжения – вы можете приложить продолжение к задаче и выполнить log / swallow / etc исключение. Это обеспечивает чистый способ регистрации исключений задач и может быть записан как простой метод расширения, то есть:

 public static void LogExceptions(this Task task) { task.ContinueWith( t => { var aggException = t.Exception.Flatten(); foreach(var exception in aggException.InnerExceptions) LogException(exception); }, TaskContinuationOptions.OnlyOnFaulted); } 

С помощью вышеизложенного вы можете не допустить, чтобы любая задача отрывала приложение и регистрировала его, используя:

 Task.Factory.StartNew( () => { // Do your work... }).LogExceptions(); 

Кроме того, вы можете подписаться на TaskScheduler.UnobservedTaskException и обрабатывать его там.

Конечно; это означает, что Task была завершена после того, как ее оставили на сборку мусора, но сама задача не удалась. Есть два исправления:

  • обрабатывать задачи не .IsFaulted напрямую (используйте ContinueWith(...) для подписки и проверки .IsFaulted и .IsFaulted в Task в параметре)
  • обработайте событие TaskScheduler.UnobservedTaskException и отметьте его наблюдаемым (вызовите e.SetObserved() после регистрации ошибки)

Попробуй это:

 public static void ThrowFirstExceptionIfHappens(this Task task) { task.ContinueWith(t => { var aggException = t.Exception.Flatten(); foreach (var exception in aggException.InnerExceptions) { throw exception; // throw only first, search for solution } }, TaskContinuationOptions.OnlyOnFaulted); // not valid for multi task continuations } public static Task CreateHandledTask(Action action) { Task tsk = Task.Factory.StartNew(action); tsk.ThrowFirstExceptionIfHappens(); return tsk; } 
Interesting Posts

Сообщения в Outlook только вычеркнуты и не удалены

invokeAndWait в SwingUtilities

В OpenCV 3.0 отсутствует несвободный модуль

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

Удаленный рабочий стол: полноэкранный режим ограничен разрешением моего основного монитора. Как я могу получить полноэкранный сеанс rdp на моем втором (большем) экране?

Обратный String C ++ с использованием массива char

Разница между {Binding PropertyName} и {Binding Path = PropertyName}

Невозможно установить платформу Hyper-V на Windows 8.1 Pro

Создание шаблонов электронной почты с помощью Django

Могу я обычно / всегда использовать std :: forward вместо std :: move?

Является ли эта реализация реализацией Fisher-Yates правильной?

что является значением по умолчанию для переменной enums

Windows 7 говорит, что 8,6-гигабайтный файл не поместится в 14,7 ГБ пространства?

Почему поврежденные жесткие диски заморожают всю систему?

Сопоставление ключа с чем-то, что не на клавиатуре

Давайте будем гением компьютера.