Исключение обработки с помощью 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