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
可以得到正确的焦点。 可能是他们根本无法看到它,因为它在你的一个表单后面,并且不知道它应该在前台。
这是应用程序还是服务。 如果是服务,可能没有设置“允许与桌面交互”权限。
请参阅服务控制面板小程序中的服务属性。
- 使用LINQ从xml中删除元素
- UWP – 应用程序文件夹中的图像Uri
- 为什么IEnumerable .Select()在2种情况中有1种工作? 无法从使用中推断出来
- IEquatable ,IEqualityComparer 之间的差异,以及在自定义对象集合上使用LINQ时覆盖.Equals()?
- 如何将标头中的用户名/密码传递给SOAP WCF服务
- 内存溢出:拥有越来越多的Microsoft.CSharp.RuntimeBinder.Semantics
- 在Unity配置中,如何将connectionString传递给构造函数?
- 协方差也在3.5 / 2.0?
- 在ColorDialog中设置CustomColors