日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

invokeRequired属性和 invoke()方法

發布時間:2025/5/22 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 invokeRequired属性和 invoke()方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

zt:?http://www.x2blog.cn/jinhong618/?tid=22389?

問: f (this.InvokeRequired)
??????????? {
??????????????? this.BeginInvoke(new MethodInvoker(LoadGlobalImage));
??????????????? return;
??????????? }

是什么意思



答: c#中禁止跨線程直接訪問控件,InvokeRequired是為了解決這個問題而產生的

當 一個控件的InvokeRequired屬性值為真時,說明有一個創建它以外的線程想訪問它,此時它將會在內部調用new MethodInvoker(LoadGlobalImage)來完成下面的步驟,這個做法保證了控件的安全,你可以這樣理解,有人想找你借錢,他可以直 接在你的錢包中拿,這樣太不安全,因此必須讓別人先要告訴你,你再從自己的錢包把錢拿出來借給別人,這樣就安全了



another:

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

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

MSDN中說:
獲取一個值,該值指示調用方在對控件進行方法調用時是否必須調用 Invoke 方法,因為調用方位于創建控件所在的線程以外的線程中。?
如果控件的 Handle 是在與調用線程不同的線程上創建的(說明您必須通過 Invoke 方法對控件進行調用),則為 true;否則為 false。
Windows 窗體中的控件被綁定到特定的線程,不具備線程安全性?。因此,如果從另一個線程調用控件的方法,那么必須使用控件的一個 Invoke 方法來將調用封送到適當的線程。該屬性可用于確定是否必須調用 Invoke 方法,當不知道什么線程擁有控件時這很有用。

下面來說下這個的用法(我的一般做法):
首先定義一個委托,與這個事件處理函數的簽名一樣委托,當然直接使用該事件的委托也是可以的,如:

?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是一個文本框。
這樣就做到了窗體中控件的線程安全性。

?

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

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

簡單的說,如果有兩個線程,Thread A和Thread B,并且有一個Control c,是在Thread A里面new的。
那么在Thread A里面運行的任何方法調用c.InvokeRequired都會返回false。
相反,如果在Thread B里面運行的任何方法調用c.InvokeRequired都會返回true。
是否是UI線程與結果無關。(通常Control所在的線程是UI線程,但是可以有例外)

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

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

我理解:如果InvokeRequired==true表示其它線程需要訪問控件,那么調用invoke來轉給控件owner處理。

轉載于:https://www.cnblogs.com/zzh1236/archive/2012/08/19/2646218.html

總結

以上是生活随笔為你收集整理的invokeRequired属性和 invoke()方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。