控制項的BeginInvoke 和 Invoke

2021-05-24 22:51:34 字數 703 閱讀 9191

兩個都是執行**,但也有不同。

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執行緒中執行 。

是否記得,「跨執行緒操作控制項」的時候我們會將操作控制項的語句,封裝到乙個**(delegate)中,然後使用 control.invoke( delegate )。其原理就是:把操作控制項的語句放到了ui執行緒(建立控制項中線程)中去執行,這樣就保障了執行緒安全。

C invoke和begininvoke 的區別

invoke和begininvoke 區別 一直對invoke和begininvoke的使用和概念比較混亂,這兩天看了些資料,對這兩個的用法和原理有了些新的認識和理解。首先說下,invoke和begininvoke的使用有兩種情況 control中的invoke begininvoke。delegr...

Invoke 和 BeginInvoke 的區別

討論環境 c net vs2005 net預設所有的可視窗體在主線程內維護,如果某工作執行緒 主線程之外 想實現對窗體控制項的操作,預設情況下是不允許直接操作的,而要通過 invoke 方法將其封送到主線程去完成。在control 類內提供了 invoke 和 begininvoke 兩個方法實現該...

避免執行緒切換時的BeginInvoke之舞

何謂begininvoke之舞.delegate void myhandlerdelegate void myhandler dogui stuff 在做多執行緒的程式時,我們常常在經過大量計算後,要將結果反饋給ui.如果在多執行緒時,直接給ui的更新的話,會引發異常.相信大家都遇上過這樣的問題,同...