关于Windows窗体中MessageBox的顺序

时间:2018-12-15 08:46:56

标签: c# windows winforms message-queue

    private void button1_Click(object sender, EventArgs e)
    {
        Thread td = new Thread(threadRun);
        td.Start();

        **MessageBox.Show("abc");**  //This is the key
        Thread.Sleep(8000);
    }
    private void ChangeText()
    {
        MessageBox.Show("changeText");
    }

    private void threadRun()
    {
        MethodInvoker In = new MethodInvoker(ChangeText);

        this.Invoke(In);
    }

此代码中发生的事情是:

  显示

changeText messageBox,

     

显示abc messageBox,

     

UI冻结8秒

但是,如果我删除abc MessageBox,则行为是:

  

UI冻结8秒

     

changeText messageBox显示

在VS的调试模式下,我可以清楚地注意到abc在changeText之前执行,但是弹出顺序相反。

如果abcMessageBox更改为新的Form()。ShowDialog(),则其作用方式相同。 显然模态对话框会改变顺序,但是,为什么?

在进行此实验之前,我以为Invoke意味着我们将一个打包的Delegate排队到UI线程的内部队列中,并且UI1线程将在button1_click完成后执行委托,这也只是从内部队列中出队,使其线程安全的。如果abc不存在,这似乎是有道理的。

里面发生了什么? 根据Messagebox的sourceCode,它只是从线程中调用win32API,而不是发送一些消息或包装一些委托。

对不起,我的Windows编程没有得到,谢谢您的帮助

0 个答案:

没有答案