国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

InvokeRequired和Invoke

2019-11-11 01:16:35
字體:
供稿:網(wǎng)友

InvokeRequired和Invoke

C#中禁止跨線程直接訪問控件,InvokeRequired是為了解決這個問題而產(chǎn)生的,當(dāng)一個控件的InvokeRequired屬性值為真時,說明有一個創(chuàng)建它以外的線程想訪問它。此時它將會在內(nèi)部調(diào)用new MethodInvoker(LoadGlobalImage)來完成下面的步驟,這個做法保證了控件的安全,你可以這樣理解,有人想找你借錢,他可以直接在你的錢包中拿,這樣太不安全,因此必須讓別人先要告訴你,你再從自己的錢包把錢拿出來借給別人,這樣就安全了

------------------------------------------------------------------------

在設(shè)計中為了讓界面與邏輯分離,我的做法是使用事件,界面只要響應(yīng)事件來處理界面的顯示就行了。而事件在邏輯處理中可能由不同的線程引發(fā),這些事件的響應(yīng)方法在修改界面中的控件內(nèi)容時便會引發(fā)一個異常。

這時就用到了Control.InvokeRequired 屬性 與Invoke方法。

------------------------------------------------------------------------

獲取一個值,該值指示調(diào)用方在對控件進(jìn)行方法調(diào)用時是否必須調(diào)用 Invoke 方法,因為調(diào)用方位于創(chuàng)建控件所在的線程以外的線程中。 

如果控件的 Handle 是在與調(diào)用線程不同的線程上創(chuàng)建的(說明您必須通過 Invoke 方法對控件進(jìn)行調(diào)用),則為 true;否則為 false。

Windows 窗體中的控件被綁定到特定的線程,不具備線程安全性 。因此,如果從另一個線程調(diào)用控件的方法,那么必須使用控件的一個 Invoke 方法來將調(diào)用封送到適當(dāng)?shù)木€程。該屬性可用于確定是否必須調(diào)用 Invoke 方法,當(dāng)不知道什么線程擁有控件時這很有用。

------------------------------------------------------------------------

首先定義一個委托,與這個事件處理函數(shù)的簽名一樣委托,當(dāng)然直接使用該事件的委托也是可以的,如:

 

 PRivate   delegate   void  InvokeCallback( string  msg);

然后就是判斷這個屬性的值來決定是否要調(diào)用Invoke函數(shù):

 

 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;

    } 

   }

說明:這個函數(shù)就是事件處理函數(shù),txtMessage是一個文本框。

這樣就做到了窗體中控件的線程安全性。

------------------------------------------------------------------------

InvokeRequired 當(dāng)前線程不是創(chuàng)建控件的線程時為true

比如你可以自己開一個Thread,或使用Timer的事件來訪問窗體上的控件的時候,在線程中窗體的這個屬性就是True的。

 

簡單的說,如果有兩個線程,Thread A和Thread B,并且有一個Control c,是在Thread A里面new的。

那么在Thread A里面運行的任何方法調(diào)用c.InvokeRequired都會返回false。

相反,如果在Thread B里面運行的任何方法調(diào)用c.InvokeRequired都會返回true。

是否是UI線程與結(jié)果無關(guān)。(通常Control所在的線程是UI線程,但是可以有例外)

 

也可以認(rèn)為,在new Control()的時候,control用一個變量記錄下了當(dāng)前線程,在調(diào)用InvokeRequired時,返回當(dāng)前線程是否不等于new的時候記錄下來的那個線程。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 洛阳市| 平遥县| 元江| 昌黎县| 佛坪县| 荆门市| 仪陇县| 江安县| 灌云县| 尖扎县| 望谟县| 铁岭县| 虞城县| 万源市| 普安县| 临安市| 和顺县| 民权县| 手机| 威海市| 巢湖市| 聊城市| 雷州市| 淮滨县| 兴隆县| 安化县| 宁夏| 子洲县| 靖安县| 云安县| 龙里县| 奉节县| 潜江市| 佛冈县| 侯马市| 类乌齐县| 平远县| 陕西省| 高淳县| 通化市| 林甸县|