privatevoid button1_click(object
sender, eventargs e)
});t.start();
}
上面的**會報錯,從新的執行緒訪問其他執行緒的控制項:這是因為.net禁止了跨執行緒呼叫控制項, 否則誰都可以操作控制項,最後可能造成錯誤。
當然,設定checkforillegalcrossthreadcalls =false 是能去掉這個檢查的,但是這不是標準的作法.
標準的作法是在訪問介面控制項時,訪問下窗體的 invokerequired 屬性,如果為false就可以直接訪問,否則就是跨執行緒訪問;此時,建立乙個delegate,並通過invoke() 來呼叫它.
privatevoid button1_click(object
sender, eventargs e)
;invoke(action,i);
}}).start();
//messagebox 沒有遵循依附性的原則,所以可以在工作執行緒中直接訪問
}
2.1 我們將action轉到定義發現
namespacesystem
2.2 action是個委託:那麼我們自己來寫個委託(對於自己未掌握的知識,我習慣用自己寫的**)
//申明乙個委託物件
public
delegate
void action2(t t);
private
void button1_click(object
sender, eventargs e)
}).start();
}public
void action2test(int
t)
簡言之,委託將引數與方法傳遞給控制項所在的執行緒,並由控制項所在的執行緒執行。
執行緒間操作無效 從不是建立控制項「XX」的執行緒訪問它
在進行執行緒方面的程式設計的時,遇到這樣的錯誤 執行緒間操作無效 從不是建立控制項 xx 的執行緒訪問它 解決方法 在建構函式中加入如下 checkforillegalcrossthreadcalls false 訪問 windows 窗體控制項本質上不是執行緒安全的。如果有兩個或多個執行緒操作某一...
執行緒間操作無效 從不是建立控制項的執行緒訪問它
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 ...