多執行緒訪問視窗控制項時異常問題

2021-04-12 17:23:08 字數 1381 閱讀 9254

[.net 1.1下允許非同步訪問,不會有異常]

在新執行緒中訪問主線程的窗體控制項時會發生錯誤,這個問題大家都知道的。

本來以為只要訪問控制項的**寫在窗體的方法中就ok了的,今天試驗了一下卻發生錯誤了。

原因是.net 1.1下允許,.net 2.0下不允許了。

我的**是這樣的:有兩個類,乙個是窗體類,乙個是某邏輯實現類,構造窗體(load)時建立乙個邏輯實現物件,訂閱邏輯實現物件的乙個事件,當事件發生時執行訪問控制項的**。

當程式執行的時候出現了乙個執行緒不安全的警告,真是沒想到呀。後來想這個**是委託呼叫的呀,既然委託了就是由新執行緒來負責呼叫的了,那麼這個警告就是合情合理的了。

那麼真正正確的編碼方式是什麼哪?翻看幫助,找到兩種實現方式:

1.同步方法 this.invoke()

private

void

settext(

string

text)

...);    

//invoke:在擁有此控制項的基礎視窗控制代碼的執行緒上執行委託。

else

...}

2. backgroundworker 類,.net 2.0 中新增類

這個類有3個主要事件:

dowork 後台任務事件(

能有多個任務嗎?待驗證!)

委託定義有兩個引數

object sender  --backgroundworker 物件

doworkeventargs e  --e.result 可以儲存後台任務的結果

runworkercompleted 後台任務完成時事件,可在委託任務中訪問呼叫執行緒的物件;

dowork 委託中能不能訪問呼叫執行緒的物件?沒有試驗過,不過在後台任務中訪問呼叫執行緒的物件也不對頭。

委託定義有兩個引數

object sender  --backgroundworker 物件

runworkercompletedeventargs e  --e.error 可判斷後台任務是否有異常發生;e.cancelled 可判斷後台任務是否被中止了

progresschanged 後台任務進度獲取事件

委託定義有兩個引數

object sender  --backgroundworker 物件

progresschangedeventargs e  --e.progresspercentage 表示進度百分比

有2個主要方法:

runworkerasync() 後台任務開始執行

reportprogress() 後台任務進度資訊發布

方法有乙個引數

int percentprogress  --任務的進度0-100間的值;呼叫時觸發 backgroundworker 物件的 progresschanged 事件

控制項多執行緒訪問的問題

最近在修改打包的介面時候,發現debug的時候,會出現多執行緒不允許訪問控制項的問題,上網查了一下,大多數解決方法都是呼叫控制項的invoke的方法,或者乾脆遮蔽掉該異常資訊。不知道什麼時候控制項可以正常允許的多執行緒訪問?vs 多執行緒debug 真難受 不知道vs2008和vs2010有沒有改進...

WPF多執行緒訪問控制項

大家知道wpf中多執行緒訪問ui控制項時會提示ui執行緒的資料不能直接被其他執行緒訪問或者修改,該怎樣來做呢?分下面兩種情況 1.winform程式 1 第一種方法,使用委託 private delegate void settextcallback string text private void...

初試C 多執行緒 跨執行緒訪問控制項

c 裡建立執行緒的方式是 thread t new thread new threadstart this.dosomething t.start 裡面的dosomething是主線程裡的乙個函式,在裡面做自己需要的操作。那我就建了乙個winform程式來試一下,畫了乙個button1,乙個text...