跨線程訪問控件問題的原因是:控件都是在主線程中創建的,而系統默認控件的修改權歸其創建線程所有。在子線程中如果需要直接修改控件的內容,需要使用委託機制將控件的修改操作交給主線程處理。因此,當沒有使用委託機制而是直接在子線程中修改控件內容時,會引發控件安全問題,即跨線程訪問控件問題。
所謂跨線程調用控件就是一個線程調用另外一個線程的控件。
常見使用情況,比如:當我們開了一個在後臺監聽消息的線程以後,需要將消息內容添加到主窗體的消息框內顯示出來。
這時候,我們就需要使用跨線程調用控件的方法。
1.首先,聲明一個委託,如:
//修飾符 delegate 返回類型 委託函數名(有參/無參);
public delegate void AddInfo_Delgegate(string message);
2.創建委託函數對象,如:
//添加消息到指定控件的函數
private void AddInfo(string message)
{
this.richTextBox_Message.Text += message;
this.richTextBox_Message.Text += "\r\n";//換行
}
AddInfo_Delegate addinfo = new AddInfo_Delegate(AddInfo);
3.在需要跨線程調用空間的地方,使用invoke方法:
this.richTextBox_Message.Invoke(addinfoDelegate, DELEGATEMESSAGE);
//this.richTextBox_Message 是需要添加消息的控件
//invoke() 正如官方解釋所說,在擁有此控件的線程上,調用指定參數列表執行委託。
//invoke() 有兩種參數模式,一是invoke(委託函數對象),二是帶參類型invoke(委託函數對象,參數)
總結,這是第一次分享經驗,表達地不是很清楚,多多指教。