首页 > 解决方案 > 关于 Windows 窗体中 MessageBox 的顺序

问题描述

    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 消息框出现,

abc messageBox 出现,

UI 冻结 8 秒

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

UI 冻结 8 秒

changeText 消息框出现

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

如果 abcMessageBox 更改为 new Form().ShowDialog() 它的行为方式相同。显然模态对话框改变了顺序,但是,为什么?

在做这个实验之前,我认为Invoke是指我们将一个打包好的Delegate加入到UI线程的内部队列中,并且UI线程会在button1_click完成后执行该delegate,它也只是从内部队列中出列,使其成为线程安全的. 如果 abc 不存在,这似乎是有道理的。

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

对不起,我的 windows 编程没有得到,谢谢你的帮助

标签: c#windowswinformsmessage-queue

解决方案


推荐阅读