控件的BeginInvoke 和 Invoke

两个都是执行代理,但也有不同。

control.BeginInvoke( action ) :

      经常我们会用到 control.BeginInvoke( action ),但很多人会误解以为 control.BeginInvoke() 是异步。其实不是那样,control.BeginInvoke( action ) 只是将 action 封装到消息中,然后插入到UI线程(创建control的线程)的消息队列尾部,也就是说执行还是在UI线程中。

      但当  delegate.BeginInvoke( callBack ) 这时才是真正的异步!

control.Invoke( action )  :

      就更好理解了,就是简单的执行action(同步方式) , 和我们调用一个方法一样。但control.Invoke( action )  也是在UI(创建control的线程)线程中执行,即使是在一个新线程(非UI线程)里调用 control.Invoke( action ) ,也是在UI线程中执行 。

扫描二维码关注公众号,回复: 1554789 查看本文章

      是否记得,“跨线程操作控件”的时候我们会将操作控件的语句,封装到一个代理(delegate)中,然后使用 control.Invoke( delegate )。其原理就是:把操作控件的语句放到了UI线程(创建控件中线程)中去执行,这样就保障了线程安全。

猜你喜欢

转载自blog.csdn.net/wqzone/article/details/6297202