MessageBox.Show()是否自动编组到UI线程?

我通过ThreadPool.QueueUserWorkItem启动一个线程,其中有一个消息框对话框:

System.Windows.Forms.DialogResult dr = System.Windows.Forms.MessageBox.Show(“你想在后台下载升级吗?..”,“升级可用”,MessageBoxButtons.YesNo);

它看起来工作正常,但是在一些客户建议他们没有收到消息后我有点怀疑。 我有.NET Framework 2.0+的感觉你不需要编组这个特定的调用,它会为你做。 正确?

这是一个感兴趣的半相关主题: 为什么在MessageBox.Show中使用所有者窗口?

不,它不支持UI线程。 如果你考虑一下,它就不可能这样做。

在应用程序中可以有多个UI线程。 某些程序(如Internet Explorer)具有许多UI线程。 .Show调用哪个UI线程?

也可以在没有UI线程的应用程序中使用MessageBox.Show。 你可以在控制台应用程序中调用它,它可以工作。

MessageBox.Show将在调用它的线程上显示UI。 如果线程上还没有运行消息泵,它将设置一个临时泵以便运行。 Show Show完成后会将其拆除。

作为一般规则,您不应在主/应用程序线程之外执行GUI工作。 我在父窗体上创建一个可以执行调用的ShowMessageBox方法:

public DialogResult ShowMessageBox (String message, String caption) { if (this.InvokeRequired) { return (DialogResult) this.Invoke (new PassStringStringReturnDialogResultDelegate (ShowMessageBox), message, caption); } return MessageBox.Show (this, message, caption); } public delegate DialogResult PassStringStringReturnDialogResultDelegate (String s1, String s2); 

但也请保持心情:在调试multithreadingGUI应用程序时,如果您在主/应用程序线程以外的线程中进行调试,则需要关闭“启用属性评估和其他隐式函数调用”选项,或者否则VS将自动从当前线程中获取本地/全局GUI对象的值,这将导致应用程序以奇怪的方式崩溃/失败。 转到工具 – >选项 – >调试以关闭该设置。

对不起盖帽,但这花了我DAYS弄清楚为什么我每次尝试调试我的应用程序时它会挂起然后崩溃。

好吧,我会编组并指定一个窗口,如果只是这样, MessageBox可以得到正确的焦点。 可能是他们根本无法看到它,因为它在你的一个表单后面,并且不知道它应该在前台。

这是应用程序还是服务。 如果是服务,可能没有设置“允许与桌面交互”权限。

请参阅服务控制面板小程序中的服务属性。