C# 關於跨線程訪問控件問題

跨線程訪問控件問題的原因是:控件都是在主線程中創建的,而系統默認控件的修改權歸其創建線程所有。在子線程中如果需要直接修改控件的內容,需要使用委託機制將控件的修改操作交給主線程處理。因此,當沒有使用委託機制而是直接在子線程中修改控件內容時,會引發控件安全問題,即跨線程訪問控件問題。


所謂跨線程調用控件就是一個線程調用另外一個線程的控件。


常見使用情況,比如:當我們開了一個在後臺監聽消息的線程以後,需要將消息內容添加到主窗體的消息框內顯示出來。


這時候,我們就需要使用跨線程調用控件的方法。


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(委託函數對象,參數) 

總結,這是第一次分享經驗,表達地不是很清楚,多多指教。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章