關於Winform中控制項的跨執行緒訪問

2022-07-16 06:51:14 字數 1498 閱讀 4942

閒著沒事想起來用winform做乙個隨機的抽號程式,咋看來這麼個東西其實並不難,不過對於乙個菜鳥來說其實並不簡單!尤其是對於多執行緒不是特別熟悉的新手來說。

首先,介面比較簡單winform,(上傳好麻煩~~!)

既然是隨機抽取號碼,就得有隨機數(其實關鍵不在這裡,圖省事就random了)

可是在用到多執行緒的時候問題就出現了:

無法跨執行緒訪問label控制項,無法修改label的text。

網上找了很多資料,感覺例子搞得難以理解,遂自己擼起。。。。

1.有人這麼寫:

// control.checkforillegalcrossthreadcalls = false;

= false;

個人感覺這麼幹絕逼不合適,遂放棄!(原因有很多)

試著用委託的方式去解決,可無奈不知為何,使用了委託之後隨機數字沒有了滾動,最後直接介面卡死,(似乎沒什麼效果╮(╯-╰)╭)

3.使用invok調事件傳方法。如**所示

11

12namespace

**程式

1322

bool stateflag = false;//

暫停標識

23 random r = new random();//

隨機數物件

2425

private

void startnum_click(object

sender, eventargs e)

2636

else

3741

4243}44

///45

///生成隨機數方法,使用控制項的invoke方法重新整理label,實現數字滾動

46///

47private

void

startrandom()

4861

if(label2.invokerequired)

6265

66if

(label3.invokerequired)

6770}71

}7273///

74///

改變label數字

75///

76///

77///

78private

void setvalue(label lab, string

lbvalue)

7982

8384

private

void form1_load(object

sender, eventargs e)

8590

}91 }

總結:其實2、3原理基本一致,後來找問題時候發現其實是用委託的時候**放錯了位置(滾去面壁!)

控制項只能由建立它的執行緒來訪問。其他執行緒想訪問必須呼叫該控制項的invoke方法。invoke有兩個引數,乙個是委託方法,乙個是引數值。

是用事件還是用委託(隨便的啦~)。

菜鳥第一篇筆記,寫得比較爛,勿轉勿噴,僅此獻給新手

winform 跨執行緒操作控制項

當進行winform的開發時,經常遇到用時比較久的操作,在傳統的單執行緒程式中,使用者必須等待這個耗時操作完成以後才能進行下一步的操作,這個時候,多執行緒程式設計就派上用場了,將這個耗時的操作放到乙個新的子執行緒中,啟動子執行緒完成操作,而不影響主線程的正常工作。那麼這個時候問題來了,當在子執行緒中...

C 跨執行緒訪問winform控制項的方法

方法一 system.windows.forms.control.checkforillegalcrossthreadcalls false 不推薦使用這種方式,禁止編譯器對跨執行緒訪問做檢查的方式實現。方法二 使用delegate和invoke private delegate void upda...

如何跨執行緒呼叫winform窗體控制項

方法一 直接關閉異常,不檢查跨執行緒呼叫private void form1 load object sender,eventargs e 方法二 利用委託 舉例1 delegate void tasktype string sztext 這裡是因為執行緒的方法只能是object型別 void th...