前提条件是: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里边有比较详细的介绍

解决方案 »

  1.   

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

  2.   

    “BeginInvoke是异步执行的,相当于新开个线程去执行”
    BeginInvoke的委托方法是执行在UI线程上的,和新线程没有关系吧。如果说没有执行顺序,那么有没有更好的原因呢,为什么没有顺序呢?
      

  3.   

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

  4.   

    我想大家没看清楚我的问题
    前提条件是:Control的BeginInvoke是在UI线程上调用的。
    想告诉楼上一下,beginInvoke是不会新开线程的,所有对控件的调用都只能在创建控件句柄的线程上调用,beginInvoke只是把delegate封送给UI线程,单执行还是在UI线程上,只是说调用beginInvoke的是新线程
      

  5.   

    如果我这样写。
    private Thread demoThread;
    private delegate void demoDelegate;
    private void DelegateMethod(){
    }
    private void StartMethod(){
    this.BeginInvoke(new demeoDelegate(DelegateMethod0);
    }private void button_click(...){
    demoThread = new Thread(new ThreadStart(StartMethod));
    demoThread.Start();
    }
    这样写的话,StartMethod是在新线程中执行,但是DelegateMethod依然在UI线程中,这个一篇文章http://www.cnblogs.com/Rustle/articles/11301.aspx讲的比较详细
      

  6.   

    不管是 Invoke 还是 beginInvoke 中间所调用的 委托方法 DelegateMethod 都要靠UI线程去完成,但是激发 Invoke,beginInvoke 所在的线程 可以 不是 UI 线程,否则 也不必要 Invoke 了