日期:2014-05-19  浏览次数:20875 次

Control的Invoke和BeginInvoke
前提条件是:Control的BeginInvoke是在UI线程上调用的,代码示例如下:
private   delegate   void   beginInvokeDelegate();
private   void   beginInvokeMethod(){
//代码段C
}

private   void   but_click(....){
//代码段A
this.BeginInvoke(new   beginInvokeDelegate(beginInvokeMethod));
//代码段B
}
问题是ABC有没有严格的执行顺序。我认为是ABC
比如我代码段B写为MessageBox.Show( "B ");
代码段C写为MessageBox.Show( "C ");
这时会先弹出C,再弹出B.但我认为这是因为Show会弹出模态对话框

如果我这样
private   string   result;
代码段B写result+=   "B ";
代码段C写result+= "C ";
结果就是BC
或者我在B和C初都sleep();
不管谁的时间长,都是B先执行。

因此我想问下:
(1)问题是ABC有没有严格的执行顺序。
(2)如果有,怎么解释这3种情况呢。
(3)Invoke和BeginInvoke和UI的消息处理有什么关系吗?
希望大家讨论下,也帮菜鸟学习下。谢谢
另:我写了篇blog...       whssunboy.cnblogs.com里边有比较详细的介绍

------解决方案--------------------
A先执行,BC的顺序不定
BeginInvoke是异步执行的,相当于新开个线程去执行,而Invoke是同步的,要等到它执行完毕后才执行后面的代码。如果你将BeginInvoke改为Invoke,那么执行顺序一定是ACB
------解决方案--------------------
BeginInvoke是异步执行的,相当于新开个线程去执行

这句话说得很正确阿。这种委托方式本来就是用于跨线程UI调用。beginInvoke即为异步调用,怎么可能不开线程,lz基本功还要补补。
还有既然是新线程操作,不稳定是肯定的,不然我们多线程程序干吗还要同步和琐,大家都按照次序一个一个来好了。就因为不稳定所以才要程序员在代码上加以控制,这才是多线程程序的难点。