我必须调用()来显示一个线程的对话框或MessageBox吗?

Dan*_*lba 8 .net c# multithreading invoke winforms

我正在工作线程中执行代码.有时,我需要显示一个对话框或一条消息.

我一直在玩代码,只是Invoke在我传递IWin32Window给对话框时似乎是严格必要的.否则工作正常.

我的问题是两个:

  1. 我必须打电话给Invoke吗?
  2. 如果我没有显示对话框或消息框,我会有什么风险Invoke

提前致谢

Han*_*ant 11

这是Winforms中的一个小错误.它包含Handle属性getter中的诊断代码,用于验证该属性是否与创建句柄的线程使用在同一个线程中.虽然对诊断线程错误非常有帮助,但这并不总是合适的.一个这样的情况是,Windows实际上并不要求窗口的父级由同一个线程拥有.

您可以通过调整SetParent()或暂时禁用使用Control.CheckForIllegalCrossThreadCalls进行检查来解决此问题.或者通过使用Control.Invoke(),最好的方法.难道不是不指定所有者解决它.由于缺少另一个窗口,对话框的所有者是桌面窗口.它与其他以桌面为所有者的窗口没有Z顺序关系.这将使对话框偶尔消失在另一个窗口后面,完全不被用户发现.

但是有一个更大的问题,在线程上显示对话框是一个讨厌的可用性问题.在她使用您的程序时将窗口推入用户的脸部是一个全面的坏主意.没有人知道当她忙着点击和打字时会发生什么.她偶然关闭对话框甚至没有看到它是一个真正的危险.不要这样做.

  • @Jalal - 是的,抱歉.这是一个值得一提的陷阱. (2认同)