Как я могу восстановить после проблемы в WPF OnRender - PullRequest
0 голосов
/ 17 июля 2010

Просто возникла интересная проблема, вызванная следующей последовательностью событий:

  • Код, вызванный из переопределения WPF OnRender, вызвал исключение (в этом нет ничего загадочного - это просто ошибка в некотором коде модели представления)

  • Исключение не было обработано, поэтому оно было обработано нашим обработчиком DispatcherUnhandledException.

  • Обработчик DispatchedUnhandledException пытается открыть окно WPF, чтобы отобразить исключение, разрешить создание отчетов и т. Д. Открытие окна завершается неудачно, вызывая другое исключение (из нашего глобального обработчика исключений), которое завершает работу приложения.

Похоже, что WPF принимает насильственное исключение (!) При попытке открыть новое окно во время выполнения OnRender, и происходят различные плохие вещи, начиная от второго исключения Win32Exception, генерируемого CreateWindowEx глубоко в WPF, до приложения, мгновенно завершающего работу если мы попытаемся сделать что-то вроде MessageBox.Show в нашем обработчике исключений, когда мы обнаружим двойное исключение.

У меня нет особых проблем с решением этой ситуации сегодня, но есть общий вопрос:

Есть ли способ восстановить состояние WPF из обработчика OnRender, чтобы обычные действия WPF могли продолжаться? Я пытался перехватить исключение в OnRender и вызвать dc.Close () перед его сбросом, но, похоже, это не имеет значения. Я полагаю, мне нужно искать вызов WpfState.Reset () или что-то в этом роде.

1 Ответ

0 голосов
/ 17 июля 2010

Возможно ли, что вы пытались открыть окно в другом потоке, отличном от основного UI-потока? Это вызвало бы исключение. Попробуйте использовать Диспетчер, чтобы открыть окно в главном потоке, если это еще не сделано.

Насколько я помню - рендеринг выполняется во вторичном потоке, чтобы не блокировать UI-поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...