国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Microsoft.NET Framework環(huán)境中異步編程淺析

2010-08-30 01:30:12曲衛(wèi)華
關(guān)鍵詞:輪詢(xún)線程調(diào)用

曲衛(wèi)華

(太原大學(xué) 計(jì)算中心,山西 太原 030009)

Microsoft.NET Framework環(huán)境中異步編程淺析

曲衛(wèi)華

(太原大學(xué) 計(jì)算中心,山西 太原 030009)

Microsoft.NET Framework環(huán)境中異步編程是非常重要的,學(xué)好異步編程可以提高初學(xué)者和科研人員的程序技巧和思維能力,有必要介紹分析異步編程模式和原理,幫助學(xué)習(xí)者在Microsoft.NET Framework下提高編程能力。

異步編程;設(shè)計(jì)模式;異步調(diào)用

文章編號(hào):1671-5977(2010)02-0116-04

Visual Studio是一套完善的工具,用于生成桌面程序和基于團(tuán)隊(duì)的企業(yè)級(jí)Web應(yīng)用程序。除了生成高性能的桌面應(yīng)用程序外,還可以使用Visual Studio的基于組件的強(qiáng)大開(kāi)發(fā)工具和其他技術(shù),簡(jiǎn)化企業(yè)級(jí)解決方案的基于團(tuán)隊(duì)的設(shè)計(jì)、開(kāi)發(fā)和部署。

異步操作通常用于執(zhí)行完成時(shí)間可能較長(zhǎng)的任務(wù),如打開(kāi)大文件、連接遠(yuǎn)程計(jì)算機(jī)或查詢(xún)數(shù)據(jù)庫(kù)。異步操作在主應(yīng)用程序線程以外的線程中執(zhí)行。應(yīng)用程序調(diào)用方法異步執(zhí)行某個(gè)操作時(shí),應(yīng)用程序可在異步方法執(zhí)行其任務(wù)時(shí)繼續(xù)執(zhí)行。

.NET Framework為異步操作提供兩種設(shè)計(jì)模式:

(1)使用IAsyncResult對(duì)象的異步操作。

(2)使用事件的異步操作。

(3)IAsyncResult設(shè)計(jì)模式允許多種編程模型,但更加復(fù)雜不易學(xué)習(xí),可提供大多數(shù)應(yīng)用程序都不要求的靈活性。可能的話,類(lèi)庫(kù)設(shè)計(jì)者應(yīng)使用事件驅(qū)動(dòng)模型實(shí)現(xiàn)異步方法。在某些情況下,庫(kù)設(shè)計(jì)者還應(yīng)實(shí)現(xiàn)基于IAsyncResult的模型。

1 異步編程模式概述

使用IAsyncResult設(shè)計(jì)模式的異步操作是通過(guò)名為Begin操作名稱(chēng)和End操作名稱(chēng)的兩個(gè)方法來(lái)實(shí)現(xiàn)的,這兩個(gè)方法分別開(kāi)始和結(jié)束異步操作操作名稱(chēng)。例如,FileStream類(lèi)提供BeginRead和EndRead方法來(lái)從文件異步讀取字節(jié)。這兩個(gè)方法實(shí)現(xiàn)了Read方法的異步版本。

在調(diào)用Begin操作名稱(chēng)后,應(yīng)用程序可以繼續(xù)在調(diào)用線程上執(zhí)行指令,同時(shí)異步操作在另一個(gè)線程上執(zhí)行。每次調(diào)用Begin操作名稱(chēng)時(shí),應(yīng)用程序還應(yīng)調(diào)用End操作名稱(chēng)來(lái)獲取操作的結(jié)果。

1.1 begin操作方法

Begin操作名稱(chēng)方法開(kāi)始異步操作操作名稱(chēng)并返回一個(gè)實(shí)現(xiàn) IAsyncResult接口的對(duì)象。IAsyncResult對(duì)象存儲(chǔ)有關(guān)異步操作的信息。下表提供了有關(guān)異步操作的信息。

表1 begin操作方法

Begin操作名稱(chēng)方法帶有該方法的同步版本的簽名中聲明的任何參數(shù)(由值傳遞或由引用傳遞)。Begin操作名稱(chēng)方法簽名中不包含任何輸出參數(shù)。Begin操作名稱(chēng)方法簽名另外還包括兩個(gè)參數(shù)。在這兩個(gè)參數(shù)中,第一個(gè)參數(shù)定義一個(gè)AsyncCallback委托,此委托引用在異步操作完成時(shí)調(diào)用的方法。如果調(diào)用方不希望在操作完成后調(diào)用方法,它可以指定null(在Visual Basic中為Nothing)。第二個(gè)參數(shù)是一個(gè)用戶(hù)定義的對(duì)象。此對(duì)象可用來(lái)向異步操作完成時(shí)調(diào)用的方法傳遞應(yīng)用程序特定的狀態(tài)信息。如果Begin操作名稱(chēng)方法還帶有其他一些操作特定的參數(shù)(例如,一個(gè)用于存儲(chǔ)從文件讀取的字節(jié)的字節(jié)數(shù)組),則AsyncCallback和應(yīng)用程序狀態(tài)對(duì)象將是Begin操作名稱(chēng)方法簽名中的最后兩個(gè)參數(shù)。

開(kāi)始操作名稱(chēng)立即返回對(duì)調(diào)用線程的控制。如果Begin操作名稱(chēng)方法引發(fā)異常,則會(huì)在開(kāi)始異步操作之前引發(fā)異常。如果Begin操作名稱(chēng)方法引發(fā)異常,則意味著沒(méi)有調(diào)用回調(diào)方法。

End操作名稱(chēng)方法可結(jié)束異步操作操作名稱(chēng)。End操作名稱(chēng)方法的返回值與其同步副本的返回值類(lèi)型相同,并且是特定于異步操作的。例如,EndRead方法返回從 FileStream讀取的字節(jié)數(shù),EndGetHostByName方法返回包含有關(guān)主機(jī)的信息的IPHostEntry對(duì)象。End操作名稱(chēng)方法帶有該方法同步版本的簽名中聲明的所有輸出參數(shù)或引用參數(shù)。除了來(lái)自同步方法的參數(shù)外, End操作名稱(chēng)方法還包括IAsyncResult參數(shù)。調(diào)用方必須將對(duì)應(yīng)調(diào)用返回的實(shí)例傳遞給Begin操作名稱(chēng)。

如果調(diào)用 End操作名稱(chēng)時(shí) IAsyncResult對(duì)象表示的異步操作尚未完成,則End操作名稱(chēng)將在異步操作完成之前阻止調(diào)用線程。異步操作引發(fā)的異常是從End操作名稱(chēng)方法引發(fā)的。未定義多次使用同一 IAsyncResult調(diào)用 End操作名稱(chēng)方法的效果。同樣,也未定義使用非相關(guān)的Begin方法返回的 IAsyncResult調(diào)用 End操作名稱(chēng)方法的效果。

1.2

對(duì)于訪問(wèn)異步操作的結(jié)果,應(yīng)用程序開(kāi)發(fā)人員有若干種設(shè)計(jì)選擇。正確的選擇取決于應(yīng)用程序是否有可以在操作完成時(shí)執(zhí)行的指令。如果應(yīng)用程序在接收到異步操作結(jié)果之前不能進(jìn)行任何其他工作,則必須先阻止該應(yīng)用程序進(jìn)行其他工作,等到獲得這些操作結(jié)果后再繼續(xù)進(jìn)行。若要在異步操作完成之前阻止應(yīng)用程序,您可以使用下列方法之一:

(1)從應(yīng)用程序的主線程調(diào)用 EndOperationName,阻止應(yīng)用程序執(zhí)行,直到操作完成之后再繼續(xù)執(zhí)行。有關(guān)演示此方法的示例,請(qǐng)參見(jiàn)通過(guò)結(jié)束異步操作來(lái)阻止應(yīng)用程序執(zhí)行。

(2)使用AsyncWaitHandle來(lái)阻止應(yīng)用程序執(zhí)行,直到一個(gè)或多個(gè)操作完成之后再繼續(xù)執(zhí)行。有關(guān)演示此方法的示例,請(qǐng)參見(jiàn)使用AsyncWaitHandle阻止應(yīng)用程序的執(zhí)行。

在異步操作完成時(shí)不需要阻止的應(yīng)用程序可使用下列方法之一:

(1)按以下方式輪詢(xún)操作完成狀態(tài):定期檢查IsCompleted屬性,操作完成后調(diào)用EndOperationName。有關(guān)演示此方法的示例,請(qǐng)參見(jiàn)輪詢(xún)異步操作的狀態(tài)。

(2)使用AsyncCallback委托來(lái)指定操作完成時(shí)要調(diào)用的方法。有關(guān)演示此方法的示例,請(qǐng)參見(jiàn)使用AsyncCallback委托結(jié)束異步操作。

2 、使用異步調(diào)用同步方法

.NET Framework允許您異步調(diào)用任何方法。為此,應(yīng)定義與您要調(diào)用的方法具有相同簽名的委托;公共語(yǔ)言運(yùn)行庫(kù)會(huì)自動(dòng)使用適當(dāng)?shù)暮灻麨樵撐卸xBeginInvoke和EndInvoke方法。

BeginInvoke方法可啟動(dòng)異步調(diào)用。它與您需要異步執(zhí)行的方法具有相同的參數(shù),另外它還有兩個(gè)可選參數(shù)。第一個(gè)參數(shù)是一個(gè)AsyncCallback委托,該委托引用在異步調(diào)用完成時(shí)要調(diào)用的方法。第二個(gè)參數(shù)是一個(gè)用戶(hù)定義的對(duì)象,該對(duì)象可向回調(diào)方法傳遞信息。BeginInvoke立即返回,不等待異步調(diào)用完成。BeginInvoke會(huì)返回IAsyncResult,這個(gè)結(jié)果可用于監(jiān)視異步調(diào)用進(jìn)度。

EndInvoke方法檢索異步調(diào)用的結(jié)果。調(diào)用BeginInvoke后可隨時(shí)調(diào)用 EndInvoke方法;如果異步調(diào)用尚未完成,EndInvoke將一直阻止調(diào)用線程,直到異步調(diào)用完成后才允許調(diào)用線程執(zhí)行。EndInvoke的參數(shù)包括您需要異步執(zhí)行的方法的out和ref參數(shù)(在Visual Basic中為 ByRef和ByRef)以及由BeginInvoke返回的 IAsyncResult。

圖1 調(diào)用同步方法代碼

2.1 調(diào)用BeginInvoke之后,您可以執(zhí)行下列操作:

(1)進(jìn)行某些操作,然后調(diào)用EndInvoke一直阻止到調(diào)用完成。

(2)使用 System.IAsyncResult.AsyncWait-Handle屬性獲取WaitHandle,使用它的WaitOne方法一直阻止執(zhí)行直到發(fā)出WaitHandle信號(hào),然后調(diào)用EndInvoke。

(3)輪詢(xún)由BeginInvoke返回的 IAsyncResult,確定異步調(diào)用何時(shí)完成,然后調(diào)用 EndInvoke。

(4)將用于回調(diào)方法的委托傳遞給BeginInvoke。異步調(diào)用完成后,將在 ThreadPool線程上執(zhí)行該方法。該回調(diào)方法將調(diào)用 EndInvoke。

2.2 定義測(cè)試方法和異步委托

下面的代碼示例演示異步調(diào)用同一個(gè)長(zhǎng)時(shí)間運(yùn)行的方法 TestMethod的各種方式。Test-Method方法會(huì)顯示一條控制臺(tái)消息,說(shuō)明它已開(kāi)始處理,休眠了幾秒鐘,然后結(jié)束。TestMethod有一個(gè)out參數(shù),該參數(shù)用于演示此種參數(shù)添加到BeginInvoke和 EndInvoke的簽名中的方式。您可以按同樣的方式處理ref參數(shù)。

下面的代碼示例演示 TestMethod的定義和名為 AsyncMethodCaller的、可用來(lái)異步調(diào)用TestMethod的委托。若要編譯任何代碼示例,必須包括 TestMethod的定義和AsyncMethodCaller委托。

2.3 使用EndInvoke等待異步調(diào)用

異步執(zhí)行方法最簡(jiǎn)單的方式是通過(guò)調(diào)用委托的BeginInvoke方法來(lái)開(kāi)始執(zhí)行方法,在主線程上執(zhí)行一些工作,然后調(diào)用委托的 EndInvoke方法。EndInvoke可能會(huì)阻止調(diào)用線程,因?yàn)樗钡疆惒秸{(diào)用完成之后才返回。這種技術(shù)非常適合文件或網(wǎng)絡(luò)操作,但是由于EndInvoke會(huì)阻止它,所以不要從服務(wù)于用戶(hù)界面的線程中調(diào)用它。

2.4 使用WaitHandle等待異步調(diào)用

您可以使用BeginInvoke返回的 IAsyncResult的 AsyncWaitHandle屬性來(lái)獲取 Wait-Handle。異步調(diào)用完成時(shí)會(huì)發(fā)出WaitHandle信號(hào),而您可以通過(guò)調(diào)用WaitOne方法等待它。如果您使用WaitHandle,則在異步調(diào)用完成之前或之后,在通過(guò)調(diào)用EndInvoke檢索結(jié)果之前,還可以執(zhí)行其他處理。

2.5 輪詢(xún)異步調(diào)用完成

可以使用由BeginInvoke返回的 IAsyncResult的 IsCompleted屬性來(lái)發(fā)現(xiàn)異步調(diào)用何時(shí)完成。從用戶(hù)界面的服務(wù)線程中進(jìn)行異步調(diào)用時(shí)可以執(zhí)行此操作。輪詢(xún)完成允許調(diào)用線程在異步調(diào)用在ThreadPool線程上執(zhí)行時(shí)繼續(xù)執(zhí)行。

圖2 輪詢(xún)異步調(diào)用

2.6 異步調(diào)用完成時(shí)執(zhí)行回調(diào)方法

如果啟動(dòng)異步調(diào)用的線程不需要是處理結(jié)果的線程,則可以在調(diào)用完成時(shí)執(zhí)行回調(diào)方法。回調(diào)方法在ThreadPool線程上執(zhí)行。

若要使用回調(diào)方法,必須將引用回調(diào)方法的AsyncCallback委托傳遞給BeginInvoke。也可以傳遞包含回調(diào)方法將要使用的信息的對(duì)象。例如,可以傳遞啟動(dòng)調(diào)用時(shí)曾使用的委托,以便回調(diào)方法能夠調(diào)用EndInvoke。

3 基于事件的異步模式概述

那些同時(shí)執(zhí)行多項(xiàng)任務(wù)、但仍能響應(yīng)用戶(hù)交互的應(yīng)用程序通常需要實(shí)施一種使用多線程的設(shè)計(jì)方案。System.Threading命名空間提供了創(chuàng)建高性能多線程應(yīng)用程序所必需的所有工具,但要想有效地使用這些工具,需要有豐富的使用多線程軟件工程的經(jīng)驗(yàn)。對(duì)于相對(duì)簡(jiǎn)單的多線程應(yīng)用程序,BackgroundWorker組件提供了一個(gè)簡(jiǎn)單的解決方案。對(duì)于更復(fù)雜的異步應(yīng)用程序,請(qǐng)考慮實(shí)現(xiàn)一個(gè)符合基于事件的異步模式的類(lèi)。

3.1 基于事件的異步模式的特征

基于事件的異步模式可以采用多種形式,具體取決于某個(gè)特定類(lèi)支持的操作的復(fù)雜程度。最簡(jiǎn)單的類(lèi)可能只有一個(gè)MethodNameAsync方法和一個(gè)對(duì)應(yīng)的 MethodNameCompleted事件。更復(fù)雜的類(lèi)可能有若干個(gè)MethodNameAsync方法(每種方法都有一個(gè)對(duì)應(yīng)的MethodNameCompleted事件),以及這些方法的同步版本。這些類(lèi)分別支持各種異步方法的取消、進(jìn)度報(bào)告和增量結(jié)果。

異步方法可能還支持多個(gè)掛起的調(diào)用(多個(gè)并行調(diào)用),允許您的代碼在此方法完成其他掛起的操作之前調(diào)用此方法任意多次。若要正確處理此種情況,必須讓您的應(yīng)用程序能夠跟蹤各個(gè)操作的完成。

3.2 基于事件的異步模式示例

SoundPlayer和 PictureBox組件表示基于事件的異步模式的簡(jiǎn)單實(shí)現(xiàn)。WebClient和BackgroundWorker組件表示基于事件的異步模式的更復(fù)雜的實(shí)現(xiàn)。

這里虛構(gòu)的AsyncExample類(lèi)有兩個(gè)方法,都支持同步和異步調(diào)用。同步重載的行為類(lèi)似于方法調(diào)用,它們對(duì)調(diào)用線程執(zhí)行操作;如果操作很耗時(shí),則調(diào)用的返回可能會(huì)有明顯的延遲。異步重載將在另一個(gè)線程上啟動(dòng)操作,然后立即返回,允許在調(diào)用線程繼續(xù)執(zhí)行的同時(shí)讓操作“在后臺(tái)”執(zhí)行。

3.3 異步方法重載

異步操作可以有兩個(gè)重載:單調(diào)用和多調(diào)用。您可以通過(guò)方法簽名來(lái)區(qū)分這兩種形式:多調(diào)用形式有一個(gè)額外的參數(shù),即userState。使用這種形式,您的代碼可以多次調(diào)用 Method1 Async(string param,object userState),而不必等待任何掛起的異步操作的完成。另一方面,如果您嘗試在前一個(gè)調(diào)用尚未完成時(shí)調(diào)用Method1 Async(string param),該方法將引發(fā)InvalidOperationException。

4 小結(jié)

異步編程是.NET Framework環(huán)境中高級(jí)開(kāi)發(fā)的一種技術(shù),系統(tǒng)了解異步編程對(duì)科研人員更好的掌握.NET Framework其內(nèi)涵和原理有重要的理論價(jià)值和現(xiàn)實(shí)意義。

[1]Yack D.,Mayo J..ASP.NET 2.0編程珠璣:來(lái)自MVP的權(quán)威開(kāi)發(fā)指南[M].北京:清華大學(xué)出版社,2006.

[2]Andrew troelsen,朱曄,肖逵,等.C#與NET 3.5高級(jí)程序設(shè)計(jì)(第4版)[M].北京:人民郵電出版社,2009.

[3]Matthew macdonald,王德才.WPF編程寶典:使用C# 2008和NET 3.5(第2版)[M].北京:清華大學(xué)出版社, 2009.

[4]Matthew MacDonald,Mario Szpuszta,博思工作室. ASP.NET高級(jí)程序設(shè)計(jì)(第3版)[M].北京:人民郵電出版社,2009.

[5]張躍廷.ASP.NET開(kāi)發(fā)實(shí)戰(zhàn)寶典[M].北京:清華大學(xué)出版社,2010.

[責(zé)任編輯:趙自謙]

The Analysis of Asynchronous Programming in Microsoft.NET Framework Environment

QU Wei-hua
(Computer Center,Taiyuan University,Taiyuan,030009,China)

Asynchronous programming is very important is Microsoft.NET Framework environment.It can help the beginners and researchesr to better their programming skills and improve their thinking abilities to learn aoynchronous programming well.It is necessary to introduce and analyze the asynchronousprogramming model and principle,help learners enhance ability of programming in Microsoft.net Framework.

asynchronous programming;programming model;asychronous call

book=2010,ebook=69

TP314

A

2010-04-19

曲衛(wèi)華(1982-),男,山西靜樂(lè)人,工學(xué)碩士,太原大學(xué)計(jì)算中心助教。

猜你喜歡
輪詢(xún)線程調(diào)用
核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
基于等概率的ASON業(yè)務(wù)授權(quán)設(shè)計(jì)?
LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
淺談linux多線程協(xié)作
基于系統(tǒng)調(diào)用的惡意軟件檢測(cè)技術(shù)研究
依托站點(diǎn)狀態(tài)的兩級(jí)輪詢(xún)控制系統(tǒng)時(shí)延特性分析
利用時(shí)間輪詢(xún)方式操作DDR3實(shí)現(xiàn)多模式下數(shù)據(jù)重排
利用RFC技術(shù)實(shí)現(xiàn)SAP系統(tǒng)接口通信
Linux線程實(shí)現(xiàn)技術(shù)研究
數(shù)據(jù)鏈輪詢(xún)多網(wǎng)優(yōu)化設(shè)計(jì)方法研究*
塔城市| 同心县| 台安县| 涟源市| 太仓市| 东乡族自治县| 曲麻莱县| 云安县| 河津市| 美姑县| 双辽市| 永泰县| 罗山县| 吴川市| 镇原县| 库伦旗| 万荣县| 周口市| 鹤壁市| 建始县| 池州市| 伊金霍洛旗| 安远县| 如东县| 北辰区| 永昌县| 迭部县| 南召县| 河北区| 台山市| 彭泽县| 通化县| 师宗县| 江源县| 巧家县| 柳林县| 惠州市| 姚安县| 方正县| 贞丰县| 保山市|