c# - 关于 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 编程没有得到,谢谢你的帮助
解决方案
推荐阅读
- facebook - Facebook Instant Games API 方法 canSubscribeBotAsync() 在测试时总是返回 false
- assembly - 汇编语言混乱
- javascript - 防止动画期间的点击事件
- airflow - 气流 - 试图循环操作员。执行不是等待实际操作完成
- python - 如何在多索引数据框中折叠具有相同值的索引
- jquery - JQuery UI 上下文菜单选项
- telepot - 如何使用用 python 和 Telepot 打开的文件发送图像?
- java - Spark Streaming Context 阻塞 REST 端点
- c - 在内核模块中使用 ip4 格式将网络字节顺序 IP 转换为主机字节顺序
- aurelia - 使用 Aurelia 路由器,我如何定义到同一个视图的两条路由?