當前位置:首頁 » 密碼管理 » 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);//這里參數不對。
}

熱點內容
在哪裡開啟密碼顯示 發布:2025-02-04 18:38:30 瀏覽:787
怎麼查詢qq密碼 發布:2025-02-04 18:20:10 瀏覽:512
python編寫介面 發布:2025-02-04 18:08:30 瀏覽:78
怎麼給游戲設置密碼 發布:2025-02-04 18:03:08 瀏覽:926
商品存儲規劃 發布:2025-02-04 17:45:24 瀏覽:567
ios訪問共享 發布:2025-02-04 17:36:33 瀏覽:335
javabuild 發布:2025-02-04 17:30:19 瀏覽:592
gnulinux編譯 發布:2025-02-04 17:30:18 瀏覽:132
蘇州阿里雲伺服器專網 發布:2025-02-04 17:21:05 瀏覽:526
如何學習php 發布:2025-02-04 17:11:55 瀏覽:389