EndInvoke方法本来就是为了阻塞当前线程而存在的,你怎么可以在调用方线程执行呢?应该在被调用方线程(辅助线程)中执行,阻塞辅助线程。你在当前线程执行等于没用多线程,和同步调用的效果一样了。
同步中,循环执行Application.DoEvents();可保证UI上随时响应消息,这样得到的效果和多线程操作类似了。

解决方案 »

  1.   

    回qldsrx,上面的代码都是我测试用的,因为不大了解invoke和endinvoke,既然不能在调用方EndInvoke,那为什么③的可以,我原本想的是①会阻塞一段时间,然后继续执行,但是不至于死机啊
      

  2.   

    Application.DoEvents();是用来响应消息的,所以不会卡死界面,你不停地处理外界消息,和只是单纯的阻塞消息是不一样的
      

  3.   

    谢谢qldsrx的回答,我想我可能是有些概念弄错了,在ui线程中使用委托的invoke,委托的方法是由threadpool开线程来执行的,那我在ui线程中调用endinvoke,阻塞的是ui线程,等到threadpool中的线程执行完毕后,ui不是就不会阻塞了吗,我这样理解有错吗
      

  4.   

    是的,我知道这样就变成了同步,但是我搞不懂的是为什么①中的代码执行后,ui就死了,我整个委托方法的执行时间不超过1S,照说应该是会卡一段时间,然后就正常了,但是我等了n久还是那样
      

  5.   

    UpdateLabel 里干了什么,如果也调用了 this.Invoke this.BeginInvoke 那 ui 线程就死锁了
      

  6.   


    控件只能在创建他的单元线程里操作  多线程也要委托invoke
      

  7.   

    BeginInvoke 没事,this.Invoke 会死锁
      

  8.   

    BeginInvoke 没事,this.Invoke 会死锁
    的确是这样 刚验证过