Проблема с использованием UnhandledException в приложении Windows Mobile - PullRequest
0 голосов
/ 12 апреля 2010

У меня есть программа для Windows Mobile, которая обращается к подключенному устройству через стороннюю DLL. Каждый вызов на устройство может занимать неизвестное время, поэтому каждый вызов включает свойство времени ожидания. Если вызов занимает больше времени, чем указанное время ожидания, DLL вместо этого выдает исключение, которое мое приложение перехватывает без проблем.

У меня проблема с закрытием приложения. Если мое приложение вызвало библиотеку DLL и ожидает истечения времени ожидания, а затем я закрываю приложение до истечения времени ожидания, мое приложение блокируется и требует перезагрузки КПК.

Я могу гарантировать, что приложение ожидает тайм-аут перед закрытием при нормальных условиях. Однако я пытаюсь использовать AppDomain.CurrentDomain.UnhandledException для перехвата любых необработанных исключений в программе и использовать событие, чтобы дождаться наступления этого ожидающего таймаута, чтобы программа могла быть окончательно закрыта.

Моя проблема в том, что это событие, кажется, не задерживается достаточно долго. Если я добавлю строку MessageBox.Show("unhandled exception"); в событие, а затем добавлю новое необработанное исключение из основной формы моего приложения, я увижу окно сообщения на долю секунды, но затем оно исчезнет без нажатия кнопки OK.

Документация, которую я нашел по этому событию, предполагает, что к тому времени, когда оно называется, приложение полностью готово к закрытию, и закрытие не может быть остановлено, но я не думал, что это означало, что сам метод события победил ' т закончить. Что дает (наверное, это вопрос)?

Обновление: В полных окнах (Vista) это работает должным образом, но только если я использую событие Application.ThreadException, которого нет в .Net CF 2.0.

1 Ответ

3 голосов
/ 19 апреля 2010

Я тоже сталкивался с этой проблемой.Это известная проблема в .NET CF (v2.0), но я также имел ее при использовании v3.5 (хотя ситуации, в которых это происходит, более специфичны).Вы можете найти (старый и все еще активный) отчет об ошибке здесь .

Вызов MessageBox.Show () вызывает его немедленное закрытие, но в моем случае было два обходных пути: 1) ВызовMessageBox.Show () во второй раз.Затем он блокируется, пока пользователь не закроет его.Вы можете проверить первый закрытый MessageBox.Show () преждевременно, проверив DialogResult.Я не помню, какой результат был возвращен именно тогда, когда произошел сбой, я помню, что он дал результат не по умолчанию.

2) Создайте пользовательскую форму и вызовите ShowDialog () для этого.Это сработало для меня, но другие сообщили, что это не работает.Вы также можете вызвать Show () и заблокировать его самостоятельно (не забудьте вызвать Application.DoEvents (), чтобы он продолжал обрабатывать события).

...