2

Я создаю версию STA для SynchronizationContext для использования в Windows Workflow 4.0. Мне интересно, что делать с исключениями при обратных вызовах Posting.Практика исключения при создании SynchronizationContext?

SynchronizationContext может быть использован для Отправить (выполнить синхронно) или Post (выполнение асинхронно) делегатов типа SendOrPostCallback. Хотя в обоих случаях я вызываю делегата в потоке STA, его легко узнать, как обрабатывать исключения при синхронном выполнении. Я блокирую вызывающий поток, вызывать обратный вызов в рабочем потоке, записывать любые исключения, разблокировать вызывающий поток и выкидывать любые записанные исключения в вызывающем потоке.

Что я должен делать на асинхронном Сообщение менее понятно. Механизм передачи этого исключения из потока выполнения обратно в вызывающий поток отсутствует. Сообщение 100% огонь и забыть. Нет EndInvoke() или WaitHandle в SendOrPostCallback. Любые исключенные исключения приведут к тому, что приложение будет снесено.

У меня нет другого выбора, кроме как сделать исключение, заброшенное в Сообщение снести мое приложение? Кажется, это поведение по умолчанию в SynchronizationContexts в рамке (спасибо, Reflector). Я не могу понять, почему это так. Не должно быть Способ предотвращения асинхронных Сообщение s от идущего бум?

ответ

5

В подобных ситуациях я даю мне принцип замены. Я бы выполнил то же поведение, что и существующие экземпляры SynchronizationContext. В противном случае нарушается принцип замещения и может вернуться, чтобы укусить вас неожиданным образом.

+0

Хмммм, хорошая точка. Но в чем дело с этим дизайном? Есть ли веская причина, почему дизайнеры фреймворка не предоставили способ обработки исключений? Вы можете легко обеспечить обратный вызов OnException в классе SendOrPostCallback, но они этого не сделали. Его почти так, как будто они ХОТЯТ, что вы быстро потерпите неудачу, если SC встретит исключение, независимо от того, насколько это несущественно. – Will

+1

В OnException нет смысла. Вы можете просто положить try-catch в делегат, который вы передаете, и делать то, что вам там нравится (маршал исключение обратно, что угодно). – Brian

+1

@ Увидев, что вызывающий объект Post мог так же легко обернуть свой вызов в заявлении try/catch и сам справиться с самим исключением. Наличие приложения быстро ускоряет ответственность за обработку ошибок для вызывающего абонента, где он должен быть. – JaredPar

2

Умирающий является удивительным.

Is "Dying is Awesome" preferred?

+0

Смотрите мой комментарий на ответ @ JaredPar. Код пользователя имеет делегат, он уже полностью контролируется. – Brian

Смежные вопросы