Обработка исключений с TPL без Wait () - PullRequest
11 голосов
/ 03 января 2012

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

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

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

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

Ответы [ 3 ]

24 голосов
/ 03 января 2012

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

task.ContinueWith(
    t => { var x = t.Exception; ...handle exception... },
    CancellationToken.None,
    TaskContinuationOptions.OnlyOnFaulted,
    TaskScheduler.FromCurrentSynchronizationContext()
);
3 голосов
/ 03 января 2012

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

2 голосов
/ 03 января 2012

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

...