C 學習筆記之invoke與BeginInvoke

2021-08-31 01:15:47 字數 2142 閱讀 6315

invoke與begininvoke的兩種使用情況:

1.control中的invoke、begininvoke

2.delegrate中的invoke、begininvoke

這兩種情況是不同的,這裡主要介紹第一種。dotnet中對invoke和begininvoke的官方定義如下:

control.invoke(引數delegate)方法:在擁有此控制項的基礎視窗控制代碼的執行緒上執行指定的委託

control.begininvoke(引數delegate)方法:在建立此控制項的基礎視窗控制代碼的執行緒上非同步執行指定的委託

其中control中的invoke和begininvoke的引數為delegate,委託的方法是在control的執行緒上執行的,即ui執行緒。由定義我們可以知道invoke表示同步、begininvoke表示非同步

下面做乙個測試:

新建乙個ui工程,介面如下圖1

invoke代段碼如下:

private

void

invoke_btn_click

(object sender,

eventargs e)

//主線程

messagebox.

show

(thread.currentthread.

gethashcode()

.tostring()

+ ch);}

private

void

startmethod()

private

void

invokemethod()

​ 測試結果:雙擊執行exe,單擊invoke,程式執行的介面:1aaa->3ccc和1bbb->1eee->3ddd。(debug模式下的hashcode可能不一樣,但是執行的順序是一樣的)

​ 結果分析:單擊invoke按鈕後,執行invoke_btn_click函式,主線程執行aaa,然後bbb和子執行緒ccc同時執行(這裡用迴圈+延時,顯示更加清楚),接著通過invoke來將invokemethod方法提交給主線程,然後子執行緒等待主線程執行完畢(即等待eee執行完成),最後執行子執行緒的ddd。

begininvoke代段碼如下:

private

void

bginvoke_btn_click

(object sender,

eventargs e)

//主線程

messagebox.

show

(thread.currentthread.

gethashcode()

.tostring()

+ ch);}

private

void

bgstartmethod()

private

void

bginvokemethod()

​ 測試結果:雙擊執行exe,單擊begininvoke,程式執行的介面:1aaa->3ccc和1bbb->1eee和3ddd。(debug模式下的hashcode可能不一樣,但是執行的順序是一樣的)

結果分析:單擊begininvoke按鈕後,執行bginvoke_btn_click函式,主線程執行aaa,然後bbb和子執行緒ccc同時執行,然後通過begininvoke來將bginvokemethod方法提交給主線程,接著主線程執行eee(主線程自己的任務完成),同時子執行緒繼續執行ddd。

​ 通過上述兩個測試可以發現:invoke和begininvoke提交的委託方法都是在主線程中執行的。但是invoke所提交的委託方法是(eee)執行完畢後,才繼續執行的ddd;而begininvoke提交的委託方法後,子執行緒可以繼續執行ddd,不需要等待eee執行完畢。因此在兩者的使用方面是不同的,當後台執行緒在更新乙個ui控制項的狀態後不需要等待,而是繼續往下執行,此時宜用begininvoke來進行處理,如一邊接收資料,將資料存入佇列,一邊對資料佇列進行文字,曲線的更新;當後台執行緒需要操作ui控制項,並且需要等待該操作執行完畢才能繼續往下執行,此時宜用invoke來進行處理,如必須接收一幀立即處理一幀資料。

C學習筆記之atoi 與strtol

這兩個函式我十分陌生,當 c primer plus 裡出現這題時 使用字元分類函式實現atoi 我上網查了好久,其實並沒有理解清楚它的存在有什麼意義,是想方便地取出字串裡的數字嗎?我以為是。於是去看了很多 很多 都是這樣定義 char a 15264 字元陣列裡的元素都是數字符號。所以我以為是想什...

C 學習筆記之容器

list 和 vector 2者都屬於容器,但list只有雙向迭代器,而vector卻有隨機訪問迭代器 迭代器的種類 前向迭代器 forward iterator 可對迭代器進行 操作雙向迭代器 bidirectional iterator 可對迭代器進行 和 操作隨機訪問迭代器 random ac...

C 學習筆記之異常

程式執行中需要處理異常 異常處理方法一 異常處理方法二 c 異常處理機制 異常處理基礎 例子1 除數為零的異常處理 ex17 1.cpp 除數為零的異常例子 include include using namespace std 定義異常類myexception class myexception ...