c 執行緒間操作無效

2021-06-01 11:27:00 字數 1837 閱讀 9383

多執行緒除錯

form1.checkforillegalcrossthreadcalls = false;

建議採用網路 上另一種 invoke  c#

小結「執行緒間操作無效: 從不是建立控制項的執行緒訪問它」 錯誤的解決方法

在程式設計中經常會遇到在乙個按鈕中執行複雜操作,並將複雜操作最後返回的值加入乙個listview或

combobox中候選。這個時候程式會卡,當程式設計師將這些卡**放進執行緒(thread)中後發現當對控制項操作時

出現「執行緒間操作無效: 從不是建立控制項的執行緒訪問它」異常。

為什麼.net不讓我們跨執行緒操作控制項,這是有好處的。因為如果你的執行緒多了,那麼當兩個執行緒

同時嘗試將乙個控制項變為自己需要的狀態時,執行緒的死鎖就會發生。但是難道就是因為這個原因,我們就

只能讓程式卡著麼?當然不是,這裡教大家乙個解決方案:用backgroundworker

這裡通過乙個例項來告訴大家backgroundworker的用法。

首先我們先定義乙個backgroundworker,大家可以去面板上拖乙個,也可以自己手工定義乙個。

this.backgroundworker_combo = new system.componentmodel.backgroundworker();//定義乙個

backgroundworker

this.backgroundworker_combo.workersupportscancellation = true;//設定能否取消任務

this.backgroundworker_combo.dowork += new system.componentmodel.doworkeventhandler

(this.backgroundworker_combo_dowork);//讓backgroundworker做的事

this.backgroundworker_combo.runworkercompleted += new

system.componentmodel.runworkercompletedeventhandler

(this.backgroundworker_combo_runworkercompleted);//當backgroundworker做完後發生的事件

如果是從面板上拖的,那麼請在dowork事件上雙擊,新增那些你想在背景執行緒中執行的**,也

就是那些可能會讓你卡的**。

然後再在runworkercompleted事件上雙擊,新增那些你想往控制項裡操作的**。

這裡有乙個開發例項,講的是實現類似google搜尋中下拉列表的實現。其思路是在dowork中搜尋

資料庫,在completed中將搜出來的東西放進去。

本文需要乙個backgroundworker,乙個combobox控制項

static char x;

///

/// 接受從dll搜出來的專案

///

方法一:

delegate void settextcallback(string text);

private void settext(string text));}

else

}catch (exception ex)

}使用時:settext(str);

方法二:

private delegate void testdelegate();

private void startmethod()

private void delegatemethod()

使用時:thread obj_thread = new thread(new threadstart(startmethod));

obj_thread.start();

C 執行緒間操作無效

最近在寫串列埠通訊 今天中午突然遇到乙個問題 我在serialport的datareceived事件中訪問 主介面的控制項 突然出現了下面的錯誤 訪問非自己執行緒的東西 會發生如上類似的錯誤 解決的方法如下 從程式設計上來說,只有建立介面的主線程才能訪問介面上的控制項,所以會出錯.當然,設定chec...

執行緒間操作無效 從不是建立控制項「XX」的執行緒訪問它

在進行執行緒方面的程式設計的時,遇到這樣的錯誤 執行緒間操作無效 從不是建立控制項 xx 的執行緒訪問它 解決方法 在建構函式中加入如下 checkforillegalcrossthreadcalls false 訪問 windows 窗體控制項本質上不是執行緒安全的。如果有兩個或多個執行緒操作某一...

執行緒間操作無效 從不是建立控制項的執行緒訪問它

using system using system.threading using system.windows.forms private void button1 click object sender,eventargs e start 出現上述錯誤的原因是 net禁止了跨執行緒呼叫控制項。只...