欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

.Net組件程序設(shè)計(jì)之異步調(diào)用-創(chuàng)新互聯(lián)

.Net組件程序設(shè)計(jì)之異步調(diào)用

成都創(chuàng)新互聯(lián)是一家網(wǎng)站設(shè)計(jì)公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營(yíng)產(chǎn)品:成都響應(yīng)式網(wǎng)站建設(shè)公司、品牌網(wǎng)站制作成都全網(wǎng)營(yíng)銷。我們專注企業(yè)品牌在網(wǎng)站中的整體樹(shù)立,網(wǎng)絡(luò)互動(dòng)的體驗(yàn),以及在手機(jī)等移動(dòng)端的優(yōu)質(zhì)呈現(xiàn)。成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、移動(dòng)互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運(yùn)營(yíng)、VI設(shè)計(jì)、云產(chǎn)品.運(yùn)維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場(chǎng)的競(jìng)爭(zhēng)激烈,認(rèn)真對(duì)待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價(jià)值服務(wù)。

說(shuō)到異步調(diào)用,在腦海中首先想到就是BeginInvoke(),在一些常用對(duì)象中我們也會(huì)常常見(jiàn)到Invoke()和BeginInvoke(), 要想讓自己的組件可以被客戶端調(diào)用或者是異步調(diào)用,這樣的設(shè)計(jì)是合理的,這也是組件異步機(jī)制當(dāng)中的一條 (說(shuō)句題外話--其實(shí)大多數(shù)知識(shí)都隱藏在我們平時(shí)經(jīng)常見(jiàn)到的對(duì)象或者是代碼里,只不過(guò)是沒(méi)有去細(xì)心的發(fā)現(xiàn)) 在.NET中首先就會(huì)想到使用委托來(lái)進(jìn)行異步調(diào)用,關(guān)于委托的定義在 委托與事件一文中已經(jīng)大概的說(shuō)過(guò)了,文中只是對(duì)委托進(jìn)行了 大概的講解,并沒(méi)有對(duì)委托的使用來(lái)說(shuō)明或者是例舉一些示例。 在本篇中將會(huì)對(duì)委托進(jìn)行一個(gè)基礎(chǔ)的揭底,主要方向是異步調(diào)用。

一 委托的老調(diào)重彈

 1     public class Operation 
 2     { 
 3         public int Addition(int num1, int num2) 
 4         { 
 5             return num1 + num2; 
 6         } 
 7         public int Subtraction(int num1, int num2) 
 8         { 
 9             return num1 - num2;
 10         }
 11     }

沒(méi)有必要直接使用Operation對(duì)象來(lái)進(jìn)行加減運(yùn)算,可以使用委托:

1 public delegate int OperationDelegate(int num1, int num2);
2 
3 Operation operation = new Operation();
4 OperationDelegate Additiondelegate = operation.Addition;
5 
6 int result;
7 result = Additiondelegate.Invoke(3, 4);
8 Debug.Assert(result == 7);

在使用委托進(jìn)行調(diào)用的時(shí)候,當(dāng)前線程是被阻塞的,只有當(dāng)委托執(zhí)行完畢了,才會(huì)把控制權(quán)交回到當(dāng)前線程。
不過(guò)呢,委托可以用于進(jìn)行異步調(diào)用目標(biāo)方法的,委托只是一種特定的類型,編譯器會(huì)把我們定義的各式各樣的委托編譯成
對(duì)應(yīng)的類,好比OperationDelegate委托一樣,實(shí)則是被編譯成這樣的

 1     public sealed class OperationDelegate : MulticastDelegate
 2     {
 3         public OperationDelegate(Object target, int methodPtr) { }
 4         public virtual Invoke(int num1,int num2)
 5         {
 6             ……
 7         }
 8 
 9         public virtual IAsyncResult BeginInvoke(int num1,int num2,AsyncCallback 
10 
11 callback,object asyncState)
12         {
13             ……
14         }
15 
16         public virtual int EndInvoke(IAsyncResult result)
17         {
18             ……
19         }
20     }

這里只是回顧一下委托的定義。

二 異步調(diào)用編程模型

圖1

.Net組件程序設(shè)計(jì)之異步調(diào)用

在上圖我們所見(jiàn)的有這幾個(gè)模塊, .NET線程池、異步調(diào)用請(qǐng)求隊(duì)列和一個(gè)應(yīng)用程序的主線程。
假使現(xiàn)在從任務(wù)1開(kāi)始執(zhí)行到任務(wù)2、任務(wù)3,到了任務(wù)3的時(shí)候,任務(wù)3請(qǐng)求.NET執(zhí)行異步操作,如圖2

圖2

.Net組件程序設(shè)計(jì)之異步調(diào)用

這個(gè)時(shí)候【任務(wù)3】已經(jīng)被送入到了【異步請(qǐng)求隊(duì)列】中,并且主線程是阻塞狀態(tài)的,再看圖3的執(zhí)行過(guò)程:

圖3

.Net組件程序設(shè)計(jì)之異步調(diào)用

線程池會(huì)及時(shí)的發(fā)現(xiàn)【異步請(qǐng)求隊(duì)列】中的任務(wù),并且根據(jù)任務(wù)的信息,線程池會(huì)分配一個(gè)線程到任務(wù)所在的主線程中執(zhí)行所請(qǐng)求的任務(wù)。 在異步任務(wù)執(zhí)行時(shí),這個(gè)時(shí)候主線程才會(huì)從阻塞中撤銷,進(jìn)入執(zhí)行狀態(tài),上圖中,就是開(kāi)始執(zhí)行任務(wù)4。

這里要說(shuō)的就是,異步調(diào)用看起來(lái)是并行執(zhí)行的,實(shí)際剛開(kāi)始的時(shí)候還是順序的,不過(guò)這時(shí)間在實(shí)際情況中是忽略不計(jì)的, 可以認(rèn)為就是并行執(zhí)行的吧。

 三 BeginInvoke()、EndInvoke()

3.1 BeginInvoke()

BeginInvoke()函數(shù)定義如下:

1 public virtual IAsyncResult BeginInvoke(int num1,int num2,AsyncCallback callback,object asyncState)
2 {
3    ……
4 }

接受OperationDelegate委托定義的原始簽名的輸入?yún)?shù),還有兩個(gè)額外參數(shù),AsyncCallback是系統(tǒng)定義的委托, 用于異步調(diào)用完成時(shí)回調(diào)所用,這里不做講解,后面會(huì)有講到,還有一個(gè)是參數(shù)是一個(gè)狀態(tài)對(duì)象,也可以認(rèn)為是容器對(duì)象, 也會(huì)在后面的章節(jié)中講到。

1 Operation operation = new Operation();
2 OperationDelegate Additiondelegate = operation.Addition;
3 Additiondelegate.BeginInvoke(3, 4, null, null);

3.2 IAsyncResult接口

正如上面所看到的,BeginInvoke函數(shù)返回一個(gè)IAsyncResult類型的值,那就來(lái)看一下IAsyncResult的定義:

1     public interface IAsyncResult
2     {
3         object AsyncState { get; }
4         WaitHandle AsyncWaitHandle { get; }
5         bool CompletedSynchronously { get; }
6         bool IsCompleted { get; }
7     }

對(duì)于IAsyncResult的詳細(xì)用法 稍后會(huì)有講解

看到第一節(jié)的Invoke函數(shù)執(zhí)行后,可以直接獲取到返回值,怎么這個(gè)BeginInvoke函數(shù)執(zhí)行了返回

IAsyncResult類型,返回值在哪呢? 可以通過(guò)從BeginInvoke函數(shù)獲得的IAsyncResult交給EndInvoke函數(shù)來(lái)獲取返回值。

1 Operation operation = new Operation();
2 OperationDelegate Additiondelegate = operation.Addition;
3 
4 IAsyncResult asyncResult = Additiondelegate.BeginInvoke(3, 4, null, null);
5 int result = Additiondelegate.EndInvoke(asyncResult);
6 Debug.Assert(result == 7);

這里要說(shuō)幾點(diǎn)

第一.調(diào)用EndInvoke函數(shù)的時(shí)候,當(dāng)前線程是被阻塞的,它在等待BeginInvoke函數(shù)執(zhí)行完畢。

第二.雖然委托可以管理多個(gè)目標(biāo)方法,但是在異步調(diào)用中,所執(zhí)行異步調(diào)用的委托,內(nèi)部的管理列表只能有一個(gè)目標(biāo)方法,不然會(huì)報(bào) 有異常。

第三.EndInvoke()在每次異步調(diào)用操作時(shí) 只能調(diào)用一次。

第四.BeginInvoke()返回的IAsyncResult類型的實(shí)例,只能傳入它所調(diào)用BeginInvoke()委托的EndInvoke()中,不然也會(huì)報(bào)有異常。

3.3 AsyncResult

假使一個(gè)客戶端在一個(gè)代碼段或者是函數(shù)中使用BeginInvoke(),而在另一段或者是其他的函數(shù)中調(diào)用EndInvoke(),這樣客戶端是不是就要保存IAsyncResult對(duì)象,又或者一個(gè)客戶端發(fā)起異步調(diào)用,并且由另一個(gè) 客戶端來(lái)調(diào)用EndInvoke(),這不僅僅要保存IAsyncResult對(duì)象,還需要保存該委托對(duì)象,而且你還得傳送過(guò)去。 還好.NET是那么的機(jī)智,有System.Runtime.Remoting.Messaging.AsyncResult類型的存在。

    public class AsyncResult : IAsyncResult, IMessageSink
    {
        #region IAsyncResult 成員
        public object AsyncState
        {
            get { throw new NotImplementedException(); }
        }
        public System.Threading.WaitHandle AsyncWaitHandle
        {
            get { throw new NotImplementedException(); }
        }
        public bool CompletedSynchronously
        {
            get { throw new NotImplementedException(); }
        }
        public bool IsCompleted
        {
            get { throw new NotImplementedException(); }
        }
        #endregion
        public bool EndInvokeCalled { get; set; }
        public virtual object AsyncDelegate { get; }

        //IMessageSink 成員
    }

看著上面有個(gè)AsyncDelegate的屬性,會(huì)不會(huì)覺(jué)得很漂亮,不錯(cuò),它就是原始發(fā)起委托的引用,看下如何使用AsyncDelegate來(lái)使用EndInvoke():

 1     public class OperationTest
 2     {
 3 
 4         public void Test()
 5         {
 6             Operation operation = new Operation();
 7             OperationDelegate Additiondelegate = operation.Addition;
 8             int Result;
 9             Result = GetResult(Additiondelegate.BeginInvoke(3, 4, null, null));
10         }
11 
12         private int GetResult(IAsyncResult asyncresult)
13         {
14             AsyncResult asyncResult = (AsyncResult)asyncresult;
15             OperationDelegate operationdelegate = asyncResult.AsyncDelegate as 
16 
17 OperationDelegate;
18             if (operationdelegate != null)
19             {
20                 Debug.Assert(asyncResult.EndInvokeCalled == false);//EndInvoke()是否被調(diào)用過(guò)
21                 return operationdelegate.EndInvoke(asyncResult);
22             }
23             return -1;
24         }
25     }

3.4 輪循或等待

看到這里,善于思考的朋友會(huì)發(fā)現(xiàn),還存在著一個(gè)很大的問(wèn)題,就是發(fā)起異步調(diào)用的客戶端,如何知道自己 的異步函數(shù)是否執(zhí)行完畢了?或者是想等待一會(huì),做一些其他的處理,然后再繼續(xù)等待,該怎么來(lái)實(shí)現(xiàn)呢?

從BeginInvoke()返回的IAsyncResult接口有個(gè)AsyncWaitHandle屬性,它是干嗎的呢?就把它理解為消息接收器吧。

1 Operation operation = new Operation();
2 OperationDelegate Additiondelegate = operation.Addition;
3 IAsyncResult asyncResult = Additiondelegate.BeginInvoke(2, 3, null, null);
4 asyncResult.AsyncWaitHandle.WaitOne();//如果任務(wù)完成則不會(huì)阻塞 否則阻塞當(dāng)前線程
5 int Result;
6 Result = Additiondelegate.EndInvoke(asyncResult);
7 Debug.Assert(Result == 5);

代碼和3.2的幾乎相同,區(qū)別就是這段代碼保證了EndInvoke()的調(diào)用者不會(huì)被阻塞。

看一下等待一下,如果沒(méi)完成處理其他任務(wù),回來(lái)再等待是怎么實(shí)現(xiàn)的。

 1 Operation operation = new Operation();
 2 OperationDelegate Additiondelegate = operation.Addition;
 3 IAsyncResult asyncResult = Additiondelegate.BeginInvoke(2, 3, null, null);
 4 while (asyncResult.IsCompleted == false)//判斷異步任務(wù)是否完成
 5 {
 6      asyncResult.AsyncWaitHandle.WaitOne(10,false);//如果任務(wù)完成則不會(huì)阻塞 否則阻塞當(dāng)前線程10毫秒
 7     //這里做一些其他操作
 8 }
 9 int Result;
10 Result = Additiondelegate.EndInvoke(asyncResult);
11 Debug.Assert(Result == 5);

3.5 使用回調(diào)函數(shù)

現(xiàn)在我們要來(lái)說(shuō)說(shuō)BeginInvoke()的第三個(gè)參數(shù)了, public delegate void AsyncCallback(IAsyncResult ar);

第三個(gè)參數(shù)就是系統(tǒng)提供的一個(gè)委托類型,委托簽名也都看到了。 使用回調(diào)函數(shù)的好處就是不需要去處理等待操作了,因?yàn)樵诋惒饺蝿?wù)完成的時(shí)候, 會(huì)調(diào)用你傳給BeginInvoke()里AsyncCallback委托所關(guān)聯(lián)的目標(biāo)方法。

 1     public class OperationTest
 2     {
 3 
 4         public void Test()
 5         {
 6             Operation operation = new Operation();
 7             OperationDelegate Additiondelegate = operation.Addition;
 8 
 9             Additiondelegate.BeginInvoke(2, 3, new AsyncCallback(OnCallBack), null);
10         }
11 
12         private void OnCallBack(IAsyncResult asyncresult)
13         {
14             AsyncResult asyncResult = (AsyncResult)asyncresult;
15             OperationDelegate operationdelegate = asyncResult.AsyncDelegate as 
16 
17 OperationDelegate;
18             if (operationdelegate != null)
19             {
20                 Debug.Assert(asyncResult.EndInvokeCalled == false);
21                 int result=operationdelegate.EndInvoke(asyncResult);
22                 Console.WriteLine("Operation returned" + result.ToString());
23             }
24         }
25     }

這里需要說(shuō)的是在異步任務(wù)完成時(shí),執(zhí)行的回調(diào)函數(shù)依然是在子線程當(dāng)中,并不是在主線程中執(zhí)行回調(diào)函數(shù)的。

題外話:最常見(jiàn)的就是在Winform開(kāi)發(fā)中,F(xiàn)orm中發(fā)起異步調(diào)用,然后回調(diào)函數(shù)操作Form中的控件或者是

值的時(shí)候就會(huì)報(bào)錯(cuò), 就是這個(gè)原因,因?yàn)樗鼈儾辉谝粋€(gè)線程也不在一個(gè)上下文中,基于.NET安全策略這種操作是不允許的。

END

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買(mǎi)多久送多久。

當(dāng)前文章:.Net組件程序設(shè)計(jì)之異步調(diào)用-創(chuàng)新互聯(lián)
當(dāng)前URL:http://aaarwkj.com/article28/gdpjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄移動(dòng)網(wǎng)站建設(shè)、軟件開(kāi)發(fā)、Google標(biāo)簽優(yōu)化、營(yíng)銷型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
欧美日韩黄色的三级视频| 中文字幕国产精品一二区| 久久不卡高清免费av| 欧美亚洲五月婷婷激情| 人妻91一区二区三区| 欧美私人影院—区二区日本| 免费毛片一区二区三区四区| 日本日韩一区二区国产| av东京热免费看一区| 成年免费视频一区二区三区| 欧美丰满老妇性猛交| 青青草最新网址在线观看视频| 免费的黄色片带中文字幕| 尤物资源视频在线观看| 人妻少妇被猛烈进入久久精品| 亚洲精品一区久久狠狠欧美| 少妇性生活视频免费观看| 蜜桃臀视频一区二区三区| 欧美日韩亚洲精品一区二区三区| 亚洲av第一区国产精品| 视频一二区免费在线观看| 国产av蜜臀一区二区三区| 国产一区二区三区在线观看俏佳人| 亚洲av在线视频免费播放| 精品乱码一区二区三区四区| 亚洲综合实力最强的国家| 亚洲一区二区精品偷拍| 免费特黄特黄的欧美大片| 视频二区国产欧美日韩| 亚洲av优选在线观看精品| 亚洲精品一区av在线观看| av天堂网站在线观看| 日韩夫妻性生活免费视频| 午夜午色夜之日本福利片| 三级日本一区二区三区| 日韩欧美在线一区二区| 国内一级黄色片免费观看| 亚洲中文无码亚洲人vr在线 | 操老熟女一区二区三区| 国产精品九九久久精品三级| 国产精品蜜臀av在线一区|