MessageBox.Show会引起跨线程异常吗?

5

我可以在子线程上调用MessageBox.Show而不必担心跨线程异常吗?我知道表面上的答案是“试一试”,我已经成功地尝试了,但我注意到Windows 7似乎比Windows XP更不严格地引发跨线程异常。

那么,有没有文档说明从子线程这样做是安全的?


你到底是什么意思?跨线程异常的来源会是什么? - Jon
1
据我所知,"跨线程调用"异常与操作系统无关。它们是使用WinForms API的特定方式的文档化结果。 - R. Martinho Fernandes
@Jon,我只是想确保调用MessageBox.Show不构成UI访问,就像操作组合框一样。我认为不会,但我想确认一下。 - Adam Rackis
这是不可能的,这是纯粹的.NET管道,与操作系统没有任何关系。 异常将永远不会在没有调试器的情况下被引发。 - Hans Passant
@Hans,看一下Alex在这个问题上的回答。我不敢说自己是.NET管道方面的专家,但我描述的情况确实发生了。http://stackoverflow.com/questions/5018169/are-cross-thread-exceptions-less-strict-in-windows-7 - Adam Rackis
显示剩余3条评论
3个回答

8
如果你调用MessageBox.Show("text")而没有指定拥有者窗口,那么是安全的。 如果你像这样调用MessageBox.Show(this,"text")并指定了拥有者窗口,情况就不同了。
我发现在Windows XP中是安全的,但在Windows 7中,如果拥有者窗口运行在与调用MessageBox的线程不同的线程中,你将遇到跨线程异常!

我现在看到了 :( 我有一个消息框显示在窗体后面。如果我按照您所述添加所有者,那么我会收到“跨线程操作无效:从创建它的线程以外的线程访问控件'[我的窗体]'”的错误提示。 - Fetchez la vache

4
不会引起任何“跨线程”异常。这是因为MessageBox不是在UI线程上运行的类的成员。

1

在单独的线程中抛出MessageBox是安全的,但请记住它只会阻塞创建它的线程。如果您正在使用WinForm应用程序并且另一个线程调用了MessageBox,则该窗体仍然可以被操作,并且用户可以忽略它。


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