Лучшая информация, которую я могу найти по этому поводу, это тот факт, что вы вызываете ShowDialog ().
Я пытался использовать Reflector, но он не обрабатывает CF-библиотеки. Так что лучшее сравнение - посмотреть на основной файл без CF. В нем, если вы отслеживаете функцию ShowDialog (), она в конечном итоге вызывает Application.RunDialog (form). Там он создает новый контекст потока и запускает свой собственный цикл сообщений для диалогового окна.
Так как я не могу заглянуть в настоящую CF DLL, я могу только сделать "обоснованное предположение". Казалось бы, это связано с тем, что исключение происходит в отдельном цикле сообщений и не будет правильно перехвачено, если вы не обработаете очередь сообщений приложения с помощью DoEvents ().
Таким образом, ShowDialog () приводит к тому, что исключение создается в отдельном цикле сообщений, и тот факт, что оно перехватывается, не обрабатывается правильно, пока вы не вызовете DoEvents ().
Что произойдет, если вы попробуете обычное шоу ()? Вам все еще нужны DoEvents? У меня нет среды, чтобы проверить это, поэтому я могу только предложить вам попробовать. Если вы измените его на Show () и больше не будете нуждаться в DoEvents (), я думаю, что тогда мы точно будем знать, был ли я прав.