當前位置:首頁 » 密碼管理 » c不是從創建它的線程訪問它

c不是從創建它的線程訪問它

發布時間: 2023-06-19 06:14:19

1. C#使用線程還是出現:線程間操作無效: 從不是創建控制項「label4」的線程訪問它。

不能從線程里直接使用this.label4.Text = shun_liuliang + "\r\n";這種的東西
因為UI控制項操作不是線程安全的
如果要通過線程更改UI,需要使用invoke來做
1.在Form里寫一個更改UI的函數

2.聲明一個代理,這個代理可以代理這個更改UI的函數

3.函數內部

if(this.label4.invokerequied)//判斷是否需要invoke操作
{
//實例化此函數自身的代理
//如果此函數有參數,需要創建一個數組,按參數數量和順序存放參數
//使用this.label4.begininvoke(代理,參數)來申請UI更新

}
else
{
//更新代碼,如this.label4.Text = shun_liuliang + "\r\n";

}

4.線程中,在要更新的地方調用這個函數即可

2. 從不是創建控制項「combobox」 的線程訪問它

使用委託來實現跨線程調用控制項。
1. 定義一個委託,然後定義一個委託對象。
private delegate void myDel();
private myDel showDel = null;
2. 把你上面的調用代碼寫到一個函數中,比如函數show中
private void show()
{
switch (comboBox1.SelectedIndex)
{
case 0:
MessageBox.Show("0");
break;
case 1:
MessageBox.Show("1");
break;
}
}
3. 用這個函數來實例化委託
showDel= new myDel(show);
3. 在你的不是創建控制項的線程中,調用委託來實現訪問控制項。
即this.Invoke(showDel);

完畢

3. 【c#高手請進!!!】從不是創建控制項的線程訪問它 修改方法

這就是你在線程里使用了控制項的原因,好像控制項都屬於主線程的,所以子線程就不能直接用了,如你所說建立委託就行了 我就認為listBoxaccept是那個控制項了
加上如下代碼:
private delegate void myDelegate(string str);
private void setRich(string str)
{
if (this.listBoxaccept.InvokeRequired)
{
myDelegate md = new myDelegate(this.setRich);
this.Invoke(md, new object[] { str });
}
else
this.listBoxaccept.Items.Add(str);
}
然後將listBoxaccept.Items.Add(richTextBoxaccept.Text);
改為this.setRich(richTextBoxaccept.Text);
哦了

4. c# 線程間操作無效: 從不是創建控制項「」的線程訪問它。

樓上已經解釋的很清楚了,VS2005以上版本跨線程處理。
在MSDN裡面可以找到,關鍵字:線程安全
委託名可以自己定義,
listBoxInfo 可以換成你的dgList。
(如果你直接執行,那麼就是從子線程調用主線程的方法執行你的操作,這樣是不允許的。
雖然沒人告訴我這是為什麼,但是我覺得(很多線程同時調用)那樣可能會導致死鎖的情況。
舉例說,我是主線程,電腦是子線程,我能夠控制子線程怎麼操作,可是你能讓電腦控制我嗎?顯然不能,也不可能。
那為什麼引用就可以呢?引用是什麼?
引用就是方法的別名,如果你打過游戲,可以理解這是方法的一個副本。
每個線程創建一個我的副本,那麼就可以執行了,不會出現爭搶,死鎖的情況。)

一樓線程安全代碼的解釋是這樣的:
定義一個委託
創建一個方法
{
如果某一個操作需調用主線程的該方法
給他創建一個該方法的副本,調用該方法的副本執行操作
如果並沒有調用主線程操作
直接執行【你需要的操作】
}

如果,你還不能理解,我只能說,I'm sorry.I do my best!

5. C#多線程問題:線程間操作無效: 從不是創建控制項「label4」的線程訪問它。

一樓正解

你是寫在GuidProc這個類裡面的,這個是不行的.必須寫在Form的類中或者子類中.就是說:this.Invoke中的this必須指的是一個窗體對象.

補充:
原因:聲明的委託需要參數.
private delegate void SetTextDelegate(string value);

解決:修改代碼.

if (this.InvokeRequired)
{
SetLabelText d = new SetLabelText(SetLabel1);
object arg = (object)要傳入的參數值
this.Invoke(d,arg);//這里參數不對。
}

熱點內容
linux解壓bin 發布:2025-03-15 19:40:25 瀏覽:381
存儲數據為什麼只能使用兩種狀態 發布:2025-03-15 19:40:21 瀏覽:261
平方的運演算法則 發布:2025-03-15 19:38:57 瀏覽:969
江蘇省蘇州市社保卡初始登錄密碼是多少 發布:2025-03-15 19:38:55 瀏覽:514
安卓主板哪裡有賣 發布:2025-03-15 19:26:10 瀏覽:30
Q9源碼 發布:2025-03-15 19:24:21 瀏覽:176
芬蘭編程教育 發布:2025-03-15 18:59:46 瀏覽:426
網際網路的伺服器地址 發布:2025-03-15 18:53:01 瀏覽:892
手機實體店什麼配置好 發布:2025-03-15 18:32:35 瀏覽:169
攜帶型電腦的原始密碼是什麼 發布:2025-03-15 18:25:52 瀏覽:798