Почему модальные диалоги, которые открываются через событие щелчка элемента меню, обрабатывают все сообщения окна? - PullRequest
4 голосов
/ 26 сентября 2008

Итак, за последний день или около того я исправлял ошибку, вызванную модальным диалогом. Я работаю над приложением, которое связывается с сервером через насос сообщений Windows. Когда я использую ShowDialog () для показа модальной формы, насос сообщений блокируется, и ни одно из моих сообщений не обрабатывается, но они накапливаются в очереди (ожидаемое поведение).

Однако недавно я заметил, что если модальная форма открывается через событие нажатия элемента меню, сообщения перекачиваются в основную форму и обрабатываются. Кто-нибудь знает, почему эти сообщения не блокируются, когда модальная форма отображается через событие нажатия элемента меню?

РЕДАКТИРОВАТЬ: я должен был отметить, что я использую C #. Как насчет этого; если никто не может ответить на этот вопрос, может кто-нибудь сказать мне, как исследовать это сам? Единственное, о чем я могу думать, это посмотреть на стек вызовов. К сожалению, это еще ничего мне не сказало.

Ответы [ 6 ]

1 голос
/ 04 февраля 2009

Как правило, ваш клиентский интерфейс не должен блокировать для длительных операций на сервере. .Net упрощает работу сервера с использованием потока BackgroundWorker. См. Этот пост для примера: Многопоточный импорт

Пример написан на VB, но вы можете перейти по ссылкам для примера на C #.

1 голос
/ 07 ноября 2008

Попробуйте установить того же владельца / родителя для диалогового окна из меню в диалоговое окно, в котором отображается ожидаемое поведение при прокачке сообщений.

1 голос
/ 26 сентября 2008

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

0 голосов
/ 26 сентября 2008

@ Крис: Я просто использую стандартный элемент управления MenuStrip. Если бы он работал в отдельном потоке, мне было бы интересно, как он отображает форму как модальную. Я экспериментировал с показом диалога из отдельного потока, чтобы не блокировать очередь сообщений, но я не могу указать основную форму как родительскую, поэтому она не является модальной.

0 голосов
/ 26 сентября 2008

Какой вид меню вы используете? Может ли он работать в отдельном потоке от того, где работает основная форма?

0 голосов
/ 26 сентября 2008

Вы вызываете ShowDialog () из события click или каким-либо другим способом?

...