国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
InvokeRequired 屬性 與Invoke方法(轉(zhuǎn))

InvokeRequired 屬性 與Invoke方法。收藏

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

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

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

MSDN中說:
獲取一個值,該值指示調(diào)用方在對控件進行方法調(diào)用時是否必須調(diào)用 Invoke 方法,因為調(diào)用方位于創(chuàng)建控件所在的線程以外的線程中。
如果控件的 Handle 是在與調(diào)用線程不同的線程上創(chuàng)建的(說明您必須通過 Invoke 方法對控件進行調(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線程,但是可以有例外)

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

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

我理解:如果InvokeRequired==true表示其它線程需要訪問控件,那么調(diào)用invoke來轉(zhuǎn)給控件owner處理

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Invoke and BeginInvoke
InvokeRequired and Invoke - jacky的日志 - 網(wǎng)易博客
對 Windows 窗體控件進行線程安全調(diào)用 - 夜淡茶清.shenfx - 博客園
子線程訪問住窗體控件
WPF中窗口控件的跨線程調(diào)用
C# WinForm 跨線程訪問控件(實用簡潔寫法)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服