小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C#線程之間操作無效|不允許訪問控件(c# 線程間操作無效: 從不是創(chuàng)建控件“”的線程訪問它)

 根的情義 2016-02-13

解決方法
1.創(chuàng)建事件委托

c#不允許對跨線程的控件的訪問,如需操作跨線程的操作需要通過委托(delegate),即是函數(shù)指針來操作跨線程。說明dgList控件不是該線程的控件,需要使用委托操作。比如:

delegate void SetListBoxCallback(string str); //定義委托(SetListBoxCallback名稱可以變化,自己定義) 
public void SetListBox(string str)
{
if (listBoxInfo.InvokeRequired) //控件是否跨線程?如果是,則執(zhí)行括號里代碼
{
SetListBoxCallback setListCallback = new SetListBoxCallback(SetListBox); //實例化委托對象
listBoxInfo.Invoke(setListCallback, str); //重新調(diào)用SetListBox函數(shù)(新創(chuàng)建的委托進行相應控件的操作
}
else //否則,即是本線程的控件,控件直接操作
{
listBoxInfo.Items.Add(str);  //具體的控件操作。eg:textBox1.Text =str;
}
}


在MSDN里面可以找到,關鍵字:線程安全
委托名可以自己定義,
(如果你直接執(zhí)行,那么就是從子線程調(diào)用主線程的方法執(zhí)行你的操作,這樣是不允許的。
雖然沒人告訴我這是為什么,但是我覺得(很多線程同時調(diào)用)那樣可能會導致死鎖的情況。
舉例說,我是主線程,電腦是子線程,我能夠控制子線程怎么操作,可是你能讓電腦控制我嗎?顯然不能,也不可能。
那為什么引用就可以呢?引用是什么?
引用就是方法的別名,如果你打過游戲,可以理解這是方法的一個副本。
每個線程創(chuàng)建一個我的副本,那么就可以執(zhí)行了,不會出現(xiàn)爭搶,死鎖的情況。)

一樓線程安全代碼的解釋是這樣的:
定義一個委托
創(chuàng)建一個方法      //在需要線程操作的地方調(diào)用此方法
{
如果某一個操作需調(diào)用主線程的該方法
給他創(chuàng)建一個該方法的副本,調(diào)用該方法的副本執(zhí)行操作
如果并沒有調(diào)用主線程操作
直接執(zhí)行【你需要的操作】 //在此你需要的操作即在主線程上進行的操作
}


2.創(chuàng)建線程(需要補全,實操未通過)

 void XXXXXX()

{

ThreadStart X;

X= new ThreadStart(func); //將類的方法綁定X。

Thread Y=new Thread(Y); //創(chuàng)建新線程

Y.Start();//線程開始

}

void func(XXXXXXXXX)  //類的一個方法

{

//對相應控件進行操作

}

ThreadStart是一個delegate 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多