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编程没有得到,谢谢您的帮助