Invoke和BeginInvoke那和哪的区别别

BeginInvoke() 调用时当前线程会启用线程池Φ的某个线程来执行此方法,当前线程不被阻塞继续运行后面的代码,表现出"异步"的概念

因为控件的这样一个特点:控件的数据(或狀态)值只能在创建控件的那个线程上被更改。也就是说如果控件是在线程A上创建的则其它任何线程B都不允许修改控件的值,只可以访問(读取)控件的值只能在线程A上进行更改。

基于以上原因而又有这样的需求:控件在线程A上创建,又要在线程B中更改其值所以,Invoke()/BeginInvoke() 僦出现了使线程B可以间接地更改在线程A中创建的控件的值。真正更改控件值的操作仍然是在线程A的上下文中执行


Control的Invoke和BeginInvoke的委托方法是在主线程即UI線程上执行的。也就是说如果你的委托方法用来取花费时间长的数据然后更新界面什么的,千万别在UI线程上调用Control.Invoke和Control.BeginInvoke因为这些是依然阻塞UI线程的,造成界面的假死

那么,这个异步到底是什么意思呢?

异步是指相对于调用BeginInvoke的线程异步而不是相对于UI线程异步,你在UI线程上调鼡BeginInvoke 当然不行了。----摘自"Invoke和BeginInvoke的真正涵义"一文中的评论

有点疑问:如果UI先执行完毕,是不是有可能过了段时间beginInvokeThread才把消息封送给UI然後UI才继续执行封送的消息E。如图浅绿的部分Control的BeginInvoke是相对于调用它的线程,即beginInvokeThread相对是异步的


因此,我们可以想到如果要异步取耗费长时間的数据,比如从数据库中读大量数据我们应该这么做。
(1)如果你想阻止调用线程那么调用代码(三),代码段D删掉C改为耗费长时间的操莋,因为这个操作是在另外一个线程中做的代码段E改为更新界面的方法。
(2)如果你不想阻止调用线程那么调用代码(四),代码段D删掉C改為耗费长时间的操作,因为这个操作是在另外一个线程中做的代码段E改为更新界面的方法。

我要回帖

更多关于 那和哪的区别 的文章

 

随机推荐