Необработанное исключение в четном блоке кода обработчика - PullRequest
0 голосов
/ 29 марта 2011

Я кодирую DLL в C ++ / CLI, которая вызывается в приложении на основе C # GUI.Я выбрасываю пользовательское исключение (производное от класса Exception), которое, если оно не проглочено в моей DLL, обрабатывается в последнем блоке catch в коде GUI.Это работает хорошо для всех бросков, кроме одного:

Я моя DLL Я реализовал обработчик, который будет прослушивать SerialPort :: DataReceived события.Если я получаю неправильный пакет, я вызываю пользовательское исключение, которое перебрасывается в блок try-catch externalmosst.Графический интерфейс должен отображать это пользовательское исключение.Но по какой-то причине исключение, возникшее в этом блоке, не выдается повторно.Вместо этого я получаю сообщение «Необработанное исключение» в режиме отладки.Когда я запускаю exe-файл, дважды щелкнув его (в папке релиза), он просто падает.Очевидно, исключения, возникающие в этом методе обработчика событий, не обрабатываются графическим интерфейсом.Или, может быть, они не передаются в графический интерфейс из моей DLL.Это не создает проблемы для других частей моей DLL.Единственная причина, по которой я могу думать об этом другом поведении, заключается в том, что обработчик событий не имеет вызывающей стороны.Правильно ли мое предположение?или есть какая-то другая причина.Любые подсказки о том, как я могу справиться с этой проблемой?Я не хочу, чтобы мое приложение зависало.Я просто хочу вызвать исключение, чтобы сообщение могло отображаться пользователю в графическом интерфейсе, и приложение могло прекратить связь с последовательным портом.

1 Ответ

1 голос
/ 29 марта 2011

Вам нужно переключиться на поток пользовательского интерфейса перед тем, как выбросить из этого обработчика события. Обычно это выполняется с помощью System :: Threading :: SynchronizationContext , но если вы используете WinForms, вы можете использовать System :: Windows :: Forms :: Control :: BeginInvoke или System :: Окна :: Forms :: Управление :: Invoke .

...