閒著沒事想起來用winform做乙個隨機的抽號程式,咋看來這麼個東西其實並不難,不過對於乙個菜鳥來說其實並不簡單!尤其是對於多執行緒不是特別熟悉的新手來說。
首先,介面比較簡單winform,(上傳好麻煩~~!)
既然是隨機抽取號碼,就得有隨機數(其實關鍵不在這裡,圖省事就random了)
可是在用到多執行緒的時候問題就出現了:
無法跨執行緒訪問label控制項,無法修改label的text。
網上找了很多資料,感覺例子搞得難以理解,遂自己擼起。。。。
1.有人這麼寫:
// control.checkforillegalcrossthreadcalls = false;
= false;
個人感覺這麼幹絕逼不合適,遂放棄!(原因有很多)
試著用委託的方式去解決,可無奈不知為何,使用了委託之後隨機數字沒有了滾動,最後直接介面卡死,(似乎沒什麼效果╮(╯-╰)╭)
3.使用invok調事件傳方法。如**所示
1112namespace
**程式
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...