Исключение обработки с помощью TPL без Wait()

У меня есть приложение с кнопками "Пуск" и "Стоп" и поток, который запускается в фоновом режиме после нажатия "Старт". Для этого я использую MVC и TPL.

Как я могу обрабатывать исключение в TPL, поскольку я никогда не вызываю метод Wait()? В любом случае мне нужно показать окно с сообщением об ошибке, и этот флажок должен отображаться после его немедленного выброса.

У меня всегда один нить в фоновом режиме, поэтому вы не можете нажать "Старт" без предварительной остановки потока.

Я ищу хорошие образцы или лучшие практики. У меня есть идея разместить try..catch внутри потока и вызвать событие для каждого catch, но я не уверен, что такой подход - хорошее решение архитектуры.

Ответ 1

Если вы используете Tasks, вы можете добавить продолжение, которое выполняется только при возникновении исключения. Вы также можете сказать, что он работает в вашем потоке пользовательского интерфейса, поэтому вы можете использовать элементы управления пользовательским интерфейсом:

task.ContinueWith(
    t => { var x = t.Exception; ...handle exception... },
    CancellationToken.None,
    TaskContinuationOptions.OnlyOnFaulted,
    TaskScheduler.FromCurrentSynchronizationContext()
);

Ответ 2

На высоком уровне метод Wait просто берет Exception, который произошел в фоновом потоке, обертывает его другим типом Exception и пересказывает его. Таким образом, вы можете наблюдать исходный Exception в фоновом потоке со стандартным блоком try / catch, окружающим ваш логический код.

Ответ 3

Нет ничего плохого в обработке права исключения в Задаче (в фоновом потоке). Если вам нужно показать пользовательский интерфейс в случае исключения, вы можете использовать диспетчер (если вы используете wpf или silverlight): http://msdn.microsoft.com/en-us/magazine/cc163328.aspx