在做WinForm應用的時候,大部分情況下都會碰到在線程中訪問界面上控件的問題;然而我們並不能用傳統方法來訪問界面上的控件,c#中禁止跨線程直接訪問控件,InvokeRequired就是為了解決這個問題而產生的。
Control.InvokeRequired
獲取一個值,該值指示調用方在對控件進行方法調用時是否必須調用 Invoke 方法,因為調用方位於創建控件所在的線程以外的線程中。
如果控件的 Handle 是在與調用線程不同的線程上創建的(說明您必須通過 Invoke 方法對控件進行調用),則為 true;否則為 false。
Windows 窗體中的控件被綁定到特定的線程,不具備線程安全性 。因此,如果從另一個線程調用控件的方法,那麼必須使用控件的一個 Invoke 方法來將調用封送到適當的線程。該屬性可用於確定是否必須調用 Invoke 方法,當不知道什麼線程擁有控件時這很有用。
下面來說下用法:
1、定義一個委托,與這個事件處理函數的簽名一樣委托,如:private delegate void InvokeCallback(string msg);
2、判斷這個屬性的值來決定是否要調用Invoke函數
void ShowMessage(string msg)
{
if (richTextBox_Esdd.InvokeRequired)
{
InvokeCallback msgCallback = new InvokeCallback(ShowMessage);
richTextBox.Invoke(msgCallback, new object[] { msg });
}
else
{
if (this.richTextBox.Lines.Length > 600)
{
this.richTextBox.Text = "";
}
richTextBox.AppendText(msg);
}
}