C# 線程訪問winform控件的方法

在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。

發佈了41 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章