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

2021-08-22 17:15:19 字數 2251 閱讀 8641

在進行執行緒方面的程式設計的時,遇到這樣的錯誤 "執行緒間操作無效:從不是建立控制項「xx」的執行緒訪問它"

解決方法:

在建構函式中加入如下**:checkforillegalcrossthreadcalls = false;

訪問 windows 窗體控制項本質上不是執行緒安全的。如果有兩個或多個執行緒操作某一控制項的狀態,則可能會迫使該控制項進入一種不一致的狀態。還可能出現其他與執行緒相關的 bug,包括爭用情況和死鎖。確保以執行緒安全方式訪問控制項非常重要。

.net framework 有助於在以非執行緒安全方式訪問控制項時檢測到這一問題。在偵錯程式中執行應用程式時,如果建立某控制項的執行緒之外的其他執行緒試圖呼叫該控制項,則偵錯程式會引發乙個 invalidoperationexception,並提示訊息:「從不是建立控制項 control name 的執行緒訪問它。」

此異常在除錯期間和執行時的某些情況下可靠地發生。強烈建議您在顯示此錯誤資訊時修復此問題。在除錯以 .net framework 2.0 版之前的 .net framework 編寫的應用程式時,可能會出現此異常。 注意 可以通過將 checkforillegalcrossthreadcalls 屬性的值設定為 false 來禁用此異常。這會使控制項以與在 visual studio 2003 下相同的方式執行。 下面的**示例演示如何從輔助線程以執行緒安全方式和非執行緒安全方式呼叫 windows 窗體控制項。它演示一種以非執行緒安全方式設定 控制項的 屬性的方法,還演示兩種以執行緒安全方式設定 text 屬性的方法。

using system;

using system.componentmodel;

using system.threading;

using system.windows.forms;

namespace crossthreaddemo

protected override void dispose(bool disposing)

base.dispose(disposing);

}// 此事件控制代碼建立乙個ie執行緒以非安全方式呼叫乙個windows窗體控制項

private void settextunsafebtn_click(

object sender,

eventargs e)

// 此方法在工作者執行緒執行並且對textbox控制項作非安全呼叫

private void threadprocunsafe()

// 此事件控制代碼建立乙個以執行緒安全方式呼叫windows窗體控制項的執行緒

private void settextsafebtn_click(

object sender,

eventargs e)

// 此方法在工作者執行緒執行並且對textbox控制項作執行緒安全呼叫

private void threadprocsafe()

// 此方法演示乙個對windows窗體控制項作執行緒安全呼叫的模式

//// 如果呼叫執行緒和建立textbox控制項的執行緒不同,這個方法建立

// **settextcallback並且自己通過invoke方法非同步呼叫它

// 如果相同則直接設定text屬性

private void settext(string text));}

else

}// 此事件控制代碼通過呼叫runworkerasync開啟窗體的backgroundworker

//// 當backgroundworker引發runworkercompleted事件的時候textbox

// 控制項的text屬性被設定

private void settextbackgroundworkerbtn_click(

object sender,

eventargs e)

// 此事件控制代碼設定textbox控制項的text屬性,它在建立textbox控制項的執行緒

// 中被呼叫,所以它的呼叫是執行緒安全的

//// backgroundworker是執行非同步操作的首選方式

private void backgroundworker1_runworkercompleted(

object sender,

runworkercompletedeventargs e)

#region windows form designer generated code

private void initializecomponent()

#endregion

[stathread]

static void main()

}}

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

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

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

下面介紹幾種跨執行緒呼叫控制項的方法 這是最簡單的辦法,相當於不檢查執行緒之間的衝突,允許各個執行緒隨便亂搞,最後lable1控制項的值是什麼就難以預料了 不推薦使用這種方法 public form1 呼叫控制項的invoke方法,就可以控制控制項了,例如 private void button2 ...

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

private void button1 click object sender,eventargs e t.start 上面的 會報錯,從新的執行緒訪問其他執行緒的控制項 這是因為.net禁止了跨執行緒呼叫控制項,否則誰都可以操作控制項,最後可能造成錯誤。當然,設定checkforillegalc...