BeginInvoke 一种是基于Control的,另外一种是关于Delegate的BeginInvoke,Control.BeginInvoke 是UI线程用于同步UI界面的一种调用方法,他仍然属于UI线程, Delegate.BeginInvoke又是怎么样的实现原理呢?他和单开一个线程然后来实现函数调用有什么区别呢?请教

解决方案 »

  1.   

    http://www.cnblogs.com/peterzb/archive/2009/06/10/1500273.html这个博客应该对你有用。
      

  2.   

    BeginInvoke要区分两种情况,一种是.net已经定义的某些IO操作类的BeginInvoke,比如socket\http\IO读写的以begin打头的方法或者sync结尾的方法,这些都是基于iocp的。
    一种是自定义delegate的BeginInvoke方法,这些实际是封装了处理器线程池。
      

  3.   

    Invoke就是直接运行,BeginInvoke是开启另一个辅助线程运行。
    delegate是定义委托类型的,相当于老版本函数指针类型,它的意义比虚函数更广泛。 
      

  4.   

    begininvoke是delegate这个class提供的函数。
    你说的control的begininvoke不过是对基类这个方法的重用罢了,其本质也还是delegate的函数。begininvoke的原理则是实现了线程池的queryuserworkitem方法,其本质无非就是线程池的其它线程的调用。begininvoke和endinvoke是.net为了实现异步的使用,而针对异步采取的一种编程范式,你可以看成是语法糖,其实无非就是异步编程的一种实现方式,如此而已。
      

  5.   


    control的begininvoke不过是对基类这个方法的重用罢了,其本质也还是delegate的函数, 既然如此他们应该属于另外一个线程,可是在调用的时候发现Control的BeginInvoke的执行体也是在ui线程中,这个该怎么理解啊
      

  6.   


    control的begininvoke的实现原理似乎与delegate不是一样的,前者一般用于对ui线程的操作,并没有开启新的线程,而是在线程中间传递了消息,实现了其之间的数据的同步
      

  7.   

    总结一下BeginEnd模型至少有三种情况
    1.Control.BeginInvoke 是用消息机制通知创建控件的UI线程
    2.比如socket\http\IO读写的以begin打头的方法或者sync结尾的方法,这些都是基于iocp的。
    3.单纯的delegate.BeginInvoke 是将任务托管给线程池