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

У меня есть приложение с кнопками Start и Stop и поток, который запускается в фоновом режиме после нажатия Start. Я использую для этого MVC и TPL.

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

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

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


person Archeg    schedule 03.01.2012    source источник


Ответы (3)


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

task.ContinueWith(
    t => { var x = t.Exception; ...handle exception... },
    CancellationToken.None,
    TaskContinuationOptions.OnlyOnFaulted,
    TaskScheduler.FromCurrentSynchronizationContext()
);
person Nick Butler    schedule 03.01.2012
comment
Это действительно хорошая функция! Спасибо - person Archeg; 05.01.2012

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

person JaredPar    schedule 03.01.2012

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

person Joel Martinez    schedule 03.01.2012