Нужно ли вызывать вызовы MessageBox?

Чтобы открыть окно сообщения, я использую MessageBox.Show(...). Обычно я оборачиваю вызов в Invoke:

BeginInvoke (new Action (() => {
    MessageBox.Show ());
}));

(Я удалил часть исходного вопроса, на который был дан ответ в другом месте)

Всегда ли мне нужно оборачивать вызов MessageBox в (Begin-)Invoke, если я звоню из потока без графического интерфейса?


person mafu    schedule 08.05.2010    source источник
comment
Я добавил новый вопрос о вопросе 2. (stackoverflow.com/questions/2819146/)   -  person mafu    schedule 12.05.2010


Ответы (2)


Краткий ответ: да, потому что я считаю это лучшей практикой.

Более длинный ответ:

Вы не должны попадать в ситуацию, когда вам приходится задавать себе этот вопрос, по крайней мере, в долгосрочной перспективе. Обычно в хорошо спроектированном программном обеспечении вы определяете «шлюзы» между пользовательским интерфейсом и «остальным миром», это также будет место, где вы инициируете события, которые уведомляют графический интерфейс о том, что что-то должно быть сделано. (через BeginInvoke(EventRaiserMethod(params))).

person stormianrootsolver    schedule 12.05.2010
comment
С точки зрения дизайна это звучит очень разумно, и я согласен. Тем не менее, меня также интересуют фактические ответы. - person mafu; 12.05.2010
comment
Извините, что нет лучших ответов, хм... но я бы сказал, что ваш первый вопрос (о необходимости) - это в основном вопрос стиля и интерпретации. Вопрос: хотите ли вы отдать вопрос безопасности потоков в руки Microsoft? Знаете ли вы, действительно ли у них есть шаблон Invoke-оболочки в их методе MessageBox.Show(...)? Что, если они это сделают и изменят это позже? Что касается второго вопроса: я немного удивлен, что это не имеет значения. Сам попробую позже, выглядит очень интересно. - person stormianrootsolver; 12.05.2010
comment
О 2): MessageBoxes имеют свой собственный насос сообщений, я считаю, что это ответственно. - person mafu; 12.05.2010
comment
Оказывается, я перепутал блокирующие вызовы графического интерфейса с блокирующим вызовом графического интерфейса. Часть 2) решена. ;) - person mafu; 12.05.2010
comment
На самом деле есть практический аспект этого вопроса, на который я только что наткнулся: у меня есть приложение Windows Forms, которое запускается только как NotifyIcon. Теперь может случиться так, что мне нужно показать окно сообщения только с NotifyIcon существующими. NotifyIcon не является Control, поэтому я не могу использовать его для вызова. На этом этапе больше ничего не существует (кажется, контекстное меню не получает дескриптор окна, пока пользователь не щелкнет по нему). - person Carsten; 31.05.2013

  1. Насколько мне известно, пока вы не указываете параметр владельца в вызове MessageBox.Show, вам не нужно вызывать вызов в потоке пользовательского интерфейса.
    То есть, если вы указываете параметр владельца, у вас есть чтобы вызвать вызов MessageBox.Show в треде, на котором был создан владелец.
    -- Пожалуйста, поправьте меня, если я ошибаюсь --
  2. Это зависит от того, хотите ли вы, чтобы поток пользовательского интерфейса продолжал выполняться или хотите, чтобы он был заблокирован при отображении msgbox.
person Jens Granlund    schedule 09.05.2010