C 跨執行緒呼叫控制項

2022-07-02 20:00:12 字數 1865 閱讀 3303

在c# 的應用程式開發中, 我們經常要把ui執行緒和工作執行緒分開,防止介面停止響應。  同時我們又需要在工作執行緒中更新ui介面上的控制項,

下面介紹幾種常用的方法

閱讀目錄

執行緒間操作無效

第一種辦法:禁止編譯器對跨執行緒訪問做檢查

第二種辦法: 使用delegate和invoke來從其他執行緒中呼叫控制項

第三種辦法: 使用delegate和begininvoke來從其他執行緒中控制控制項

第四種辦法: 使用backgroundworker元件

介面上有乙個button和乙個label,  點選button會啟動乙個執行緒來更新label的值

private

void button1_click(object

sender, eventargs e)

private

void updatelabel(object

str)

執行後, 程式會報錯 "跨執行緒操作無效,從不是建立"label1"的執行緒訪問它"

這是因為.net禁止了跨執行緒呼叫控制項, 否則誰都可以操作控制項,最後可能造成錯誤。   

下面介紹幾種跨執行緒呼叫控制項的方法

這是最簡單的辦法, 相當於不檢查執行緒之間的衝突,允許各個執行緒隨便亂搞,最後lable1控制項的值是什麼就難以預料了 (在多人開發的專案中,不推薦使用這種方法)

public

form1()

在你的程式初始化的時候設定了這個屬性,而且在你的控制項中使用的都是微軟framework類庫中的控制項的話,系統就不會再丟擲你上面所說的這個錯誤了

checkforillegalcrossthreadcalls 這個屬性的定義,就會發現它是乙個static的,也就是說無論我們在專案的什麼地方修改了這個值,他就會在全域性起作用。而且像這種跨執行緒訪問是否存在異 常,我們通常都會去檢查。如果專案中其他人修改了這個屬性,那麼我們的方案就失敗了,我們要採取另外的方案。­

呼叫控制項的invoke方法,就可以控制控制項了,例如

private

void button2_click(object

sender, eventargs e)

private

void updatelabel2(object

str)

;//或者

//actionactiondelegate = delegate(string txt) ;

this

.label2.invoke(actiondelegate, str);

}else

}

只要把上面的 this.label2.invoke(actiondelegate, str); 中的 invoke 改為begininvoke方法就可以了

invoke方法和begininvoke方法的區別是

invoke方法是同步的, 它會等待工作執行緒完成,

begininvoke方法是非同步的, 它會另起乙個執行緒去完成工作執行緒

private

void button4_click(object

sender, eventargs e)

}void bw_dowork(object

sender, doworkeventargs e)

void bw_runworkercompleted(object

sender, runworkercompletedeventargs e)

2e1ef0fe-1b3b-e511-b908-9dcfd8948a

C 跨執行緒呼叫控制項

在c 應用程式開發中,我們經常需要把ui執行緒和工作執行緒分開程式設計,為了防止介面停止響應。同時,我們也需要在工作執行緒中去更新ui介面的控制項,在clr的執行緒安全中並不允許我們直接在工作執行緒操作ui介面。因此,介紹以下三種方式進行跨執行緒操作ui。private void button2 c...

C 跨執行緒呼叫窗體控制項

前段時間遇到跨執行緒呼叫窗體控制項的問題,其實一句話system.windows.forms.control.checkforillegalcrossthreadcalls false 就可以解決,但感覺會有不穩定因素,因此在網上找了一些相應的文章感覺還不錯,第一種用的比較順手 注 在devexpr...

C 跨執行緒呼叫窗體控制項的問題

前段時間遇到跨執行緒呼叫窗體控制項的問題,其實一句話system.windows.forms.control.checkforillegalcrossthreadcalls false 就可以解決,但感覺會有不穩定因素,因此在網上找了一些相應的文章感覺還不錯,第一種用的比較順手 注 在devexpr...