最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c# Invoke和BeginInvoke 區(qū)別分析

 更新時間:2014年10月22日 17:15:17   投稿:mdxy-dxy  
這篇文章主要介紹了c# Invoke和BeginInvoke 區(qū)別分析,需要的朋友可以參考下

Control.Invoke 方法 (Delegate) :擁有此控件的基礎(chǔ)窗口句柄的線程上執(zhí)行指定的委托。

Control.BeginInvoke 方法 (Delegate) :在創(chuàng)建控件的基礎(chǔ)句柄所在線程上異步執(zhí)行指定委托。

(一)Control的Invoke和BeginInvoke

我們要基于以下認(rèn)識:
(1)Control的Invoke和BeginInvoke與Delegate的Invoke和BeginInvoke是不同的。
(2)Control的Invoke和BeginInvoke的參數(shù)為delegate,委托的方法是在Control的線程上執(zhí)行的,也就是我們平時所說的UI線程。

我們以代碼(一)來看(Control的Invoke)

private delegate void InvokeDelegate();
private void InvokeMethod(){
//C代碼段
}
private void butInvoke_Click(object sender, EventArgs e) {
//A代碼段.......
this.Invoke(new InvokeDelegate(InvokeMethod));
//B代碼段......
}

你覺得代碼的執(zhí)行順序是什么呢?記好Control的Invoke和BeginInvoke都執(zhí)行在主線程即UI線程上
A------>C---------------->B
解釋:(1)A在UI線程上執(zhí)行完后,開始Invoke,Invoke是同步
(2)代碼段B并不執(zhí)行,而是立即在UI線程上執(zhí)行InvokeMethod方法,即代碼段C。
(3)InvokeMethod方法執(zhí)行完后,代碼段C才在UI線程上繼續(xù)執(zhí)行。

看看代碼(二),Control的BeginInvoke

private delegate void BeginInvokeDelegate();
private void BeginInvokeMethod(){
//C代碼段
}
private void butBeginInvoke_Click(object sender, EventArgs e) {
//A代碼段.......
this.BeginInvoke(new BeginInvokeDelegate(BeginInvokeMethod));
//B代碼段......
}

你覺得代碼的執(zhí)行順序是什么呢?記好Control的Invoke和BeginInvoke都執(zhí)行在主線程即UI線程上
A----------->B--------------->C慎重,這個只做參考。。。。。,我也不肯定執(zhí)行順序,如果有哪位達人知道的話請告知。

解釋::(1)A在UI線程上執(zhí)行完后,開始BeginInvoke,BeginInvoke是異步

(2)InvokeMethod方法,即代碼段C不會執(zhí)行,而是立即在UI線程上執(zhí)行代碼段B。
(3)代碼段B執(zhí)行完后(就是說butBeginInvoke_Click方法執(zhí)行完后),InvokeMethod方法,即代碼段C才在UI線程上繼續(xù)執(zhí)行。

由此,我們知道:

Control的Invoke和BeginInvoke的委托方法是在主線程,即UI線程上執(zhí)行的。也就是說如果你的委托方法用來取花費時間長的數(shù)據(jù),然后更新界面什么的,千萬別在UI線程上調(diào)用Control.Invoke和Control.BeginInvoke,因為這些是依然阻塞UI線程的,造成界面的假死。

那么,這個異步到底是什么意思呢?

異步是指相對于調(diào)用BeginInvoke的線程異步,而不是相對于UI線程異步,你在UI線程上調(diào)用BeginInvoke ,當(dāng)然不行了。----摘自"Invoke和BeginInvoke的真正涵義"一文中的評論。
BeginInvoke的原理是將調(diào)用的方法Marshal成消息,然后調(diào)用Win32 API中的RegisterWindowMessage()向UI窗口發(fā)送消息。----摘自"Invoke和BeginInvoke的真正涵義"一文中的評論。

(二)我們用Thread來調(diào)用BeginInvoke和Invoke

我們開一個線程,讓線程執(zhí)行一些耗費時間的操作,然后再用Control.Invoke和Control.BeginInvoke回到用戶UI線程,執(zhí)行界面更新。

代碼(三) Thread調(diào)用Control的Invoke

private Thread invokeThread;
private delegate void invokeDelegate();
private void StartMethod(){
//C代碼段......
Control.Invoke(new invokeDelegate(invokeMethod));
//D代碼段......
}
private void invokeMethod(){
//E代碼段
}
private void butInvoke_Click(object sender, EventArgs e) {
//A代碼段.......
invokeThread = new Thread(new ThreadStart(StartMethod));
invokeThread.Start();
//B代碼段......
}


你覺得代碼的執(zhí)行順序是什么呢?記好Control的Invoke和BeginInvoke都執(zhí)行在主線程即UI線程上
A------>(Start一開始B和StartMethod的C就同時執(zhí)行)---->(C執(zhí)行完了,不管B有沒有執(zhí)行完,invokeThread把消息封送(invoke)給UI線程,然后自己等待)---->UI線程處理完butInvoke_Click消息后,處理invokeThread封送過來的消息,執(zhí)行invokeMethod方法,即代碼段E,處理往后UI線程切換到invokeThread線程。

這個Control.Invoke是相對于invokeThread線程同步的,阻止了其運行。


解釋:

1。UI執(zhí)行A
2。UI開線程InvokeThread,B和C同時執(zhí)行,B執(zhí)行在線程UI上,C執(zhí)行在線程invokeThread上。
3。invokeThread封送消息給UI,然后自己等待,UI處理完消息后,處理invokeThread封送的消息,即代碼段E
4。UI執(zhí)行完E后,轉(zhuǎn)到線程invokeThread上,invokeThread線程執(zhí)行代碼段D

代碼(四) Thread調(diào)用Control的BeginInvoke

private Thread beginInvokeThread;
private delegate void beginInvokeDelegate();
private void StartMethod(){
//C代碼段......
Control.BeginInvoke(new beginInvokeDelegate(beginInvokeMethod));
//D代碼段......
}
private void beginInvokeMethod(){
//E代碼段
}
private void butBeginInvoke_Click(object sender, EventArgs e) {
//A代碼段.......
beginInvokeThread = new Thread(new ThreadStart(StartMethod));
beginInvokeThread .Start();
//B代碼段......
}


你覺得代碼的執(zhí)行順序是什么呢?記好Control的Invoke和BeginInvoke都執(zhí)行在主線程即UI線程上
A在UI線程上執(zhí)行----->beginInvokeThread線程開始執(zhí)行,UI繼續(xù)執(zhí)行代碼段B,并發(fā)地invokeThread執(zhí)行代碼段C-------------->不管UI有沒有執(zhí)行完代碼段B,這時beginInvokeThread線程把消息封送給UI,單自己并不等待,繼續(xù)向下執(zhí)行-------->UI處理完butBeginInvoke_Click消息后,處理beginInvokeThread線程封送過來的消息。



解釋:

1。UI執(zhí)行A
2。UI開線程beginInvokeThread,B和C同時執(zhí)行,B執(zhí)行在線程UI上,C執(zhí)行在線程beginInvokeThread上。
3。beginInvokeThread封送消息給UI,然后自己繼續(xù)執(zhí)行代碼D,UI處理完消息后,處理invokeThread封送的消息,即代碼段E
有點疑問:如果UI先執(zhí)行完畢,是不是有可能過了段時間beginInvokeThread才把消息封送給UI,然后UI才繼續(xù)執(zhí)行封送的消息E。如圖淺綠的部分。

Control的BeginInvoke是相對于調(diào)用它的線程,即beginInvokeThread相對是異步的。
因此,我們可以想到。如果要異步取耗費長時間的數(shù)據(jù),比如從數(shù)據(jù)庫中讀大量數(shù)據(jù),我們應(yīng)該這么做。
(1)如果你想阻止調(diào)用線程,那么調(diào)用代碼(三),代碼段D刪掉,C改為耗費長時間的操作,因為這個操作是在另外一個線程中做的。代碼段E改為更新界面的方法。
(2)如果你不想阻止調(diào)用線程,那么調(diào)用代碼(四),代碼段D刪掉,C改為耗費長時間的操作,因為這個操作是在另外一個線程中做的。代碼段E改為更新界面的方法。

相關(guān)文章

  • C#四舍五入用法實例

    C#四舍五入用法實例

    這篇文章主要為大家詳細介紹了C#四舍五入用法實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 利用C#實現(xiàn)修改圖片透明度功能

    利用C#實現(xiàn)修改圖片透明度功能

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)修改圖片透明度功能,文中的示例代碼講解詳細,對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12
  • C#中Equals方法的常見誤解

    C#中Equals方法的常見誤解

    equals方法被用來檢測兩個對象是否相等,即兩個對象的內(nèi)容是否相等。本文主要介紹的是equals方法,初學(xué)者對它幾個常見的誤解,一起來看。
    2015-10-10
  • C#?實例解釋面向?qū)ο缶幊讨械膯我还δ茉瓌t(示例代碼)

    C#?實例解釋面向?qū)ο缶幊讨械膯我还δ茉瓌t(示例代碼)

    本文我介紹了?SOLID?原則中的單一功能原則(single-responsibility?principle),并通過?C#?代碼示例簡明地詮釋了它的含意和實現(xiàn),對C#?面向?qū)ο缶幊淘瓌t感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • C#代碼實現(xiàn)對AES加密解密

    C#代碼實現(xiàn)對AES加密解密

    這篇文章主要介紹了C#代碼實現(xiàn)對AES加密解密的相關(guān)資料,AES是一個新的可以用于保護電子數(shù)據(jù)的加密算法,需要的朋友可以參考下
    2015-12-12
  • C#通過屬性名字符串獲取、設(shè)置對象屬性值操作示例

    C#通過屬性名字符串獲取、設(shè)置對象屬性值操作示例

    這篇文章主要介紹了C#通過屬性名字符串獲取、設(shè)置對象屬性值操作,結(jié)合實例形式總結(jié)分析了C#通過反射獲取對象屬性值并設(shè)置屬性值,獲取對象的所有屬性名稱及類型等相關(guān)操作技巧,需要的朋友可以參考下
    2020-03-03
  • 深入解析C#設(shè)計模式編程中對建造者模式的運用

    深入解析C#設(shè)計模式編程中對建造者模式的運用

    這篇文章主要介紹了C#設(shè)計模式編程中對建造者模式的運用,文中還介紹了在.NET框架下建造者模式編寫思路的實現(xiàn),需要的朋友可以參考下
    2016-02-02
  • c#動態(tài)編譯執(zhí)行對象方法示例 運用映射機制創(chuàng)建對象

    c#動態(tài)編譯執(zhí)行對象方法示例 運用映射機制創(chuàng)建對象

    本示例核心技術(shù)是運用.NET動態(tài)編譯技術(shù)+.NET映射技術(shù),把一個代碼塊中的代碼,動態(tài)編譯成程序集后,在運用映射機制,創(chuàng)建對象示例,調(diào)用對象方法
    2014-01-01
  • C#二分查找算法

    C#二分查找算法

    這篇文章介紹了C#中的二分查找算法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • c# 區(qū)分幾種定時器(timer)

    c# 區(qū)分幾種定時器(timer)

    這篇文章主要介紹了c# 幾種定時器(timer)的區(qū)別,文中講解非常細致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07

最新評論

华池县| 凭祥市| 平度市| 潼南县| 南陵县| 绵阳市| 深圳市| 万盛区| 资兴市| 海南省| 静海县| 玉树县| 中阳县| 宁晋县| 清新县| 禹城市| 平江县| 监利县| 乡城县| 巨鹿县| 丹江口市| 滕州市| 广宗县| 龙江县| 松原市| 岑巩县| 饶阳县| 防城港市| 手机| 南木林县| 新邵县| 壶关县| 罗平县| 溆浦县| 库车县| 湄潭县| 乌恰县| 砚山县| 平泉县| 凌源市| 赫章县|