在c# 的應用程式開發中, 我們經常要把ui執行緒和工作執行緒分開,防止介面停止響應。 同時我們又需要在工作執行緒中更新ui介面上的控制項,
下面介紹幾種常用的方法
閱讀目錄
執行緒間操作無效
第一種辦法:禁止編譯器對跨執行緒訪問做檢查
第二種辦法: 使用delegate和invoke來從其他執行緒中呼叫控制項
第三種辦法: 使用delegate和begininvoke來從其他執行緒中控制控制項
第四種辦法: 使用backgroundworker元件
介面上有乙個button和乙個label, 點選button會啟動乙個執行緒來更新label的值
private執行後, 程式會報錯 "跨執行緒操作無效,從不是建立"label1"的執行緒訪問它"void button1_click(object
sender, eventargs e)
private
void updatelabel(object
str)
這是因為.net禁止了跨執行緒呼叫控制項, 否則誰都可以操作控制項,最後可能造成錯誤。
下面介紹幾種跨執行緒呼叫控制項的方法
這是最簡單的辦法, 相當於不檢查執行緒之間的衝突,允許各個執行緒隨便亂搞,最後lable1控制項的值是什麼就難以預料了 (在多人開發的專案中,不推薦使用這種方法)
public在你的程式初始化的時候設定了這個屬性,而且在你的控制項中使用的都是微軟framework類庫中的控制項的話,系統就不會再丟擲你上面所說的這個錯誤了form1()
checkforillegalcrossthreadcalls 這個屬性的定義,就會發現它是乙個static的,也就是說無論我們在專案的什麼地方修改了這個值,他就會在全域性起作用。而且像這種跨執行緒訪問是否存在異 常,我們通常都會去檢查。如果專案中其他人修改了這個屬性,那麼我們的方案就失敗了,我們要採取另外的方案。
呼叫控制項的invoke方法,就可以控制控制項了,例如
private只要把上面的 this.label2.invoke(actiondelegate, str); 中的 invoke 改為begininvoke方法就可以了void button2_click(object
sender, eventargs e)
private
void updatelabel2(object
str)
;//或者
//actionactiondelegate = delegate(string txt) ;
this
.label2.invoke(actiondelegate, str);
}else
}
invoke方法和begininvoke方法的區別是
invoke方法是同步的, 它會等待工作執行緒完成,
begininvoke方法是非同步的, 它會另起乙個執行緒去完成工作執行緒
private2e1ef0fe-1b3b-e511-b908-9dcfd8948avoid button4_click(object
sender, eventargs e)
}void bw_dowork(object
sender, doworkeventargs e)
void bw_runworkercompleted(object
sender, runworkercompletedeventargs e)
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...