我需要调用MessageBox吗?

5
为了弹出一个消息框,我使用MessageBox.Show(...)。我通常会将调用包装在一个Invoke中:
BeginInvoke (new Action (() => {
    MessageBox.Show ());
}));

(其他地方得到回答))

如果我从非GUI线程调用MessageBox,我是否总是需要在(Begin-) Invoke中包装MessageBox调用?


我添加了一个关于问题2的新问题。(https://dev59.com/SnE85IYBdhLWcg3wXCIv) - mafu
2个回答

1

简短回答:是的,因为我认为这是最佳实践。

长一点的回答:

你不应该陷入这种情况,至少从长远来看不应该。通常,在一个设计良好的软件中,你已经定义了用户界面和“世界其他部分”之间的“网关”,这也是你触发事件并通过BeginInvoke(EventRaiserMethod(params))通知GUI执行某些操作的地方。


从设计角度来看,这听起来非常合理,我同意。然而,我也对实际答案感兴趣。 - mafu
很抱歉没有更好的答案,嗯...但我想说,你的第一个问题(关于必要性)大多是风格和解释的问题。问题是:你想把线程安全的问题交给微软处理吗?你知道他们的“Invoke”-包装器模式是否实际上存在于他们的“MessageBox.Show(...)”-方法中吗?如果他们这样做并且以后更改了呢?关于第二个问题:我有点惊讶它没有任何区别。稍后我会自己尝试一下,这看起来非常有趣。 - stormianrootsolver
关于2):MessageBoxes有自己的消息泵,我相信那是负责的。 - mafu
原来我混淆了对GUI的阻塞调用和在GUI上的阻塞调用。第二部分问题已解决,;) - mafu
实际上,这个问题有一个实际的方面,我刚刚偶然发现:我有一个作为“NotifyIcon”启动的Windows Forms应用程序。现在可能会发生这样的情况,我需要仅使用现有的“NotifyIcon”显示消息框。 “NotifyIcon”不是“Control”,因此我无法使用它来调用。在这个阶段没有其他内容存在(上下文菜单在用户单击它之前不会获得窗口句柄,似乎)。 - Carsten

0
据我所知,只要在调用MessageBox.Show时不提供owner参数,就不必在UI线程上调用该调用。
也就是说,如果提供了owner参数,则必须在创建owner的线程上调用MessageBox.Show
--如果我错了,请纠正我--
这取决于您是否希望UI线程继续执行,还是希望在显示消息框时阻塞它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接