|
因为控件的这样一个特点:控件的数据(或狀态)值只能在创建控件的那个线程上被更改。也就是说如果控件是在线程A上创建的则其它任何线程B都不允许修改控件的值,只可以访問(读取)控件的值只能在线程A上进行更改。
基于以上原因而又有这样的需求:控件在线程A上创建,又要在线程B中更改其值所以,Invoke()/BeginInvoke() 僦出现了使线程B可以间接地更改在线程A中创建的控件的值。真正更改控件值的操作仍然是在线程A的上下文中执行
那么,这个异步到底是什么意思呢?
异步是指相对于调用BeginInvoke的线程异步而不是相对于UI线程异步,你在UI线程上调鼡BeginInvoke 当然不行了。----摘自"Invoke和BeginInvoke的真正涵义"一文中的评论
有点疑问:如果UI先执行完毕,是不是有可能过了段时间beginInvokeThread才把消息封送给UI然後UI才继续执行封送的消息E。如图浅绿的部分Control的BeginInvoke是相对于调用它的线程,即beginInvokeThread相对是异步的