在winform外調用winform控件的方法很多,比如delegate、Action、Func等方法異步調用,但是C#中禁止跨線程直接訪問控件,InvokeRequired是爲了解決這個問題而產生的,當一個控件的InvokeRequired屬性值爲真時,說明有一個創建它以外的線程想訪問它。
Windows 窗體中的控件被綁定到特定的線程,不具備線程安全性 。因此,如果從另一個線程調用控件的方法,那麼必須使用控件的一個 Invoke 方法來將調用封送到適當的線程。該屬性可用於確定是否必須調用 Invoke 方法,當不知道什麼線程擁有控件時這很有用。
具體用線程訪問winform控件的方法,如下:
首先定義一個委託,與這個事件處理函數的簽名一樣委託,當然直接使用該事件的委託也是可以的,如:
private delegate void InvokeCallback( string msg);
//然後就是判斷這個屬性的值來決定是否要調用Invoke函數:
void m_comm_MessageEvent( string msg)
{
if (txtMessage.InvokeRequired)
{
InvokeCallbackmsgCallback = new InvokeCallback(m_comm_MessageEvent);
txtMessage.Invoke(msgCallback, new object [] { msg } );
}
else
{
txtMessage.Text = msg;
}
}
說明:這個函數就是事件處理函數,txtMessage是一個文本框。
這樣就做到了窗體中控件的線程安全性。
簡單的說,如果有兩個線程,Thread A和Thread B,並且有一個Control c,是在Thread A裏面new的。
那麼在Thread A裏面運行的任何方法調用c.InvokeRequired都會返回false。
相反,如果在Thread B裏面運行的任何方法調用c.InvokeRequired都會返回true。