解決方法 c#不允許對(duì)跨線程的控件的訪問(wèn),,如需操作跨線程的操作需要通過(guò)委托(delegate),,即是函數(shù)指針來(lái)操作跨線程。說(shuō)明dgList控件不是該線程的控件,,需要使用委托操作,。比如: delegate void SetListBoxCallback(string str); //定義委托(SetListBoxCallback名稱可以變化,自己定義)
public void SetListBox(string str)
{
if (listBoxInfo.InvokeRequired) //控件是否跨線程,?如果是,,則執(zhí)行括號(hào)里代碼
{
SetListBoxCallback setListCallback = new SetListBoxCallback(SetListBox); //實(shí)例化委托對(duì)象
listBoxInfo.Invoke(setListCallback, str); //重新調(diào)用SetListBox函數(shù)(新創(chuàng)建的委托進(jìn)行相應(yīng)控件的操作
}
else //否則,即是本線程的控件,,控件直接操作
{
listBoxInfo.Items.Add(str); //具體的控件操作,。eg:textBox1.Text =str;
}
} 在MSDN里面可以找到,關(guān)鍵字:線程安全 委托名可以自己定義,, (如果你直接執(zhí)行,,那么就是從子線程調(diào)用主線程的方法執(zhí)行你的操作,這樣是不允許的,。 雖然沒(méi)人告訴我這是為什么,,但是我覺(jué)得(很多線程同時(shí)調(diào)用)那樣可能會(huì)導(dǎo)致死鎖的情況。 舉例說(shuō),,我是主線程,,電腦是子線程,我能夠控制子線程怎么操作,,可是你能讓電腦控制我嗎,?顯然不能,也不可能。 那為什么引用就可以呢,?引用是什么,? 引用就是方法的別名,如果你打過(guò)游戲,,可以理解這是方法的一個(gè)副本,。 每個(gè)線程創(chuàng)建一個(gè)我的副本,那么就可以執(zhí)行了,,不會(huì)出現(xiàn)爭(zhēng)搶,,死鎖的情況。) 一樓線程安全代碼的解釋是這樣的: 定義一個(gè)委托 創(chuàng)建一個(gè)方法 //在需要線程操作的地方調(diào)用此方法 { 如果某一個(gè)操作需調(diào)用主線程的該方法 給他創(chuàng)建一個(gè)該方法的副本,,調(diào)用該方法的副本執(zhí)行操作 如果并沒(méi)有調(diào)用主線程操作 直接執(zhí)行【你需要的操作】 //在此你需要的操作即在主線程上進(jìn)行的操作 }
2.創(chuàng)建線程(需要補(bǔ)全,,實(shí)操未通過(guò)) void XXXXXX() { ThreadStart X; X= new ThreadStart(func); //將類的方法綁定X。 Thread Y=new Thread(Y); //創(chuàng)建新線程 Y.Start();//線程開(kāi)始 } void func(XXXXXXXXX) //類的一個(gè)方法 { //對(duì)相應(yīng)控件進(jìn)行操作 } ThreadStart是一個(gè)delegate |
|
來(lái)自: 根的情義 > 《C#編程開(kāi)發(fā)》