为什么通过菜单项的单击事件打开的模式对话框会处理所有窗口消息?
时间:2020-03-06 14:45:22 来源:igfitidea点击:
因此,在过去的一天左右的时间里,我一直在修复由模式对话框引起的错误。我在通过Windows消息泵与服务器通信的应用程序上工作。当我使用ShowDialog()显示模式形式时,消息泵被阻止并且没有任何消息被处理,但是它们确实在队列中堆积(预期的行为)。
但是,我最近注意到,如果通过菜单项的click事件打开模式窗体,则消息将被泵送到主窗体并进行处理。有谁知道为什么通过菜单项的click事件显示模式窗体时这些消息没有被阻止?
编辑:我应该注意到我正在使用C#。
这个怎么样;如果没有人可以回答这个问题,谁能告诉我该如何进行调查?我唯一能想到的就是看一下调用堆栈。不幸的是,这还没有告诉我任何事情。
解决方案
我们是通过click事件还是其他某种方式调用ShowDialog()?
是的,我正在从菜单项的click事件中调用ShowDialog()。在这种情况下,消息通过模式对话框被泵送到主表单。
我们使用哪种菜单控件?它可以在与运行主窗体的线程不同的线程上运行吗?
@克里斯:我只是在使用标准的MenuStrip控件。如果它在单独的线程上运行,那么我将对它如何以形式显示形式感兴趣。我尝试从单独的线程显示对话框,以不阻塞消息队列,但是我无法将主窗体指定为父窗体,因此它不是模态窗体。
尝试从菜单到显示预期消息泵送行为的对话框,为对话框设置相同的所有者/父对象。
通常,客户端用户界面不应阻止长时间的服务器操作。 .Net使使用BackgroundWorker线程进行服务器工作变得非常容易。有关示例,请参见此帖子:多线程导入
该示例在VB中,但是我们可以点击Cexample的链接。