C#子執行緒操作主執行緒中的控制元件
阿新 • • 發佈:2019-01-28
有兩種方法可以選擇:
1、在程式初始化的時候對要操作的控制元件設定下面的屬性:
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
這樣,系統就不會再丟擲上面所說的這個錯誤了。
從實質上說,該方法是通過採用取消執行緒安全保護模式的方式實現的,所以不建議採用。
2、基本思路如下:
把想對另一執行緒中的控制元件實施的操作放到一個函式中,然後使用delegate代理那個函式,並且在那個函式中加入一個判斷,用InvokeRequired 來判斷呼叫這個函式的執行緒是否和控制元件執行緒處於同一執行緒中,如果是則直接執行對控制元件的操作,否則利用該控制元件的Invoke或BeginInvoke方法來執行這個代理。
示例程式碼如下(假設此控制元件為TreeView控制元件,名字為函式中treeViewFiled):
操作控制元件的方法:
private void InitialTreeView(CaseForm caseform) { if (this.treeViewFiled.InvokeRequired == false) //如果為同一執行緒 { //此處寫對控制元件的操作 } else { InitialTreeViewDelegate initTreeView = new InitialTreeViewDelegate(InitialTreeView); this.treeViewFiled.Invoke(initTreeView, caseform); } }
定義委託:
private delegate void InitialTreeViewDelegate(CaseForm caseform);
然後就可以直接在子執行緒中呼叫InitialTreeView方法