999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Microsoft.NET Framework環境中異步編程淺析

2010-08-30 01:30:12曲衛華
太原學院學報(社會科學版) 2010年2期
關鍵詞:方法

曲衛華

(太原大學 計算中心,山西 太原 030009)

Microsoft.NET Framework環境中異步編程淺析

曲衛華

(太原大學 計算中心,山西 太原 030009)

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

異步編程;設計模式;異步調用

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

Visual Studio是一套完善的工具,用于生成桌面程序和基于團隊的企業級Web應用程序。除了生成高性能的桌面應用程序外,還可以使用Visual Studio的基于組件的強大開發工具和其他技術,簡化企業級解決方案的基于團隊的設計、開發和部署。

異步操作通常用于執行完成時間可能較長的任務,如打開大文件、連接遠程計算機或查詢數據庫。異步操作在主應用程序線程以外的線程中執行。應用程序調用方法異步執行某個操作時,應用程序可在異步方法執行其任務時繼續執行。

.NET Framework為異步操作提供兩種設計模式:

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

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

(3)IAsyncResult設計模式允許多種編程模型,但更加復雜不易學習,可提供大多數應用程序都不要求的靈活性。可能的話,類庫設計者應使用事件驅動模型實現異步方法。在某些情況下,庫設計者還應實現基于IAsyncResult的模型。

1 異步編程模式概述

使用IAsyncResult設計模式的異步操作是通過名為Begin操作名稱和End操作名稱的兩個方法來實現的,這兩個方法分別開始和結束異步操作操作名稱。例如,FileStream類提供BeginRead和EndRead方法來從文件異步讀取字節。這兩個方法實現了Read方法的異步版本。

在調用Begin操作名稱后,應用程序可以繼續在調用線程上執行指令,同時異步操作在另一個線程上執行。每次調用Begin操作名稱時,應用程序還應調用End操作名稱來獲取操作的結果。

1.1 begin操作方法

Begin操作名稱方法開始異步操作操作名稱并返回一個實現 IAsyncResult接口的對象。IAsyncResult對象存儲有關異步操作的信息。下表提供了有關異步操作的信息。

表1 begin操作方法

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

開始操作名稱立即返回對調用線程的控制。如果Begin操作名稱方法引發異常,則會在開始異步操作之前引發異常。如果Begin操作名稱方法引發異常,則意味著沒有調用回調方法。

End操作名稱方法可結束異步操作操作名稱。End操作名稱方法的返回值與其同步副本的返回值類型相同,并且是特定于異步操作的。例如,EndRead方法返回從 FileStream讀取的字節數,EndGetHostByName方法返回包含有關主機的信息的IPHostEntry對象。End操作名稱方法帶有該方法同步版本的簽名中聲明的所有輸出參數或引用參數。除了來自同步方法的參數外, End操作名稱方法還包括IAsyncResult參數。調用方必須將對應調用返回的實例傳遞給Begin操作名稱。

如果調用 End操作名稱時 IAsyncResult對象表示的異步操作尚未完成,則End操作名稱將在異步操作完成之前阻止調用線程。異步操作引發的異常是從End操作名稱方法引發的。未定義多次使用同一 IAsyncResult調用 End操作名稱方法的效果。同樣,也未定義使用非相關的Begin方法返回的 IAsyncResult調用 End操作名稱方法的效果。

1.2

對于訪問異步操作的結果,應用程序開發人員有若干種設計選擇。正確的選擇取決于應用程序是否有可以在操作完成時執行的指令。如果應用程序在接收到異步操作結果之前不能進行任何其他工作,則必須先阻止該應用程序進行其他工作,等到獲得這些操作結果后再繼續進行。若要在異步操作完成之前阻止應用程序,您可以使用下列方法之一:

(1)從應用程序的主線程調用 EndOperationName,阻止應用程序執行,直到操作完成之后再繼續執行。有關演示此方法的示例,請參見通過結束異步操作來阻止應用程序執行。

(2)使用AsyncWaitHandle來阻止應用程序執行,直到一個或多個操作完成之后再繼續執行。有關演示此方法的示例,請參見使用AsyncWaitHandle阻止應用程序的執行。

在異步操作完成時不需要阻止的應用程序可使用下列方法之一:

(1)按以下方式輪詢操作完成狀態:定期檢查IsCompleted屬性,操作完成后調用EndOperationName。有關演示此方法的示例,請參見輪詢異步操作的狀態。

(2)使用AsyncCallback委托來指定操作完成時要調用的方法。有關演示此方法的示例,請參見使用AsyncCallback委托結束異步操作。

2 、使用異步調用同步方法

.NET Framework允許您異步調用任何方法。為此,應定義與您要調用的方法具有相同簽名的委托;公共語言運行庫會自動使用適當的簽名為該委托定義BeginInvoke和EndInvoke方法。

BeginInvoke方法可啟動異步調用。它與您需要異步執行的方法具有相同的參數,另外它還有兩個可選參數。第一個參數是一個AsyncCallback委托,該委托引用在異步調用完成時要調用的方法。第二個參數是一個用戶定義的對象,該對象可向回調方法傳遞信息。BeginInvoke立即返回,不等待異步調用完成。BeginInvoke會返回IAsyncResult,這個結果可用于監視異步調用進度。

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

圖1 調用同步方法代碼

2.1 調用BeginInvoke之后,您可以執行下列操作:

(1)進行某些操作,然后調用EndInvoke一直阻止到調用完成。

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

(3)輪詢由BeginInvoke返回的 IAsyncResult,確定異步調用何時完成,然后調用 EndInvoke。

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

2.2 定義測試方法和異步委托

下面的代碼示例演示異步調用同一個長時間運行的方法 TestMethod的各種方式。Test-Method方法會顯示一條控制臺消息,說明它已開始處理,休眠了幾秒鐘,然后結束。TestMethod有一個out參數,該參數用于演示此種參數添加到BeginInvoke和 EndInvoke的簽名中的方式。您可以按同樣的方式處理ref參數。

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

2.3 使用EndInvoke等待異步調用

異步執行方法最簡單的方式是通過調用委托的BeginInvoke方法來開始執行方法,在主線程上執行一些工作,然后調用委托的 EndInvoke方法。EndInvoke可能會阻止調用線程,因為它直到異步調用完成之后才返回。這種技術非常適合文件或網絡操作,但是由于EndInvoke會阻止它,所以不要從服務于用戶界面的線程中調用它。

2.4 使用WaitHandle等待異步調用

您可以使用BeginInvoke返回的 IAsyncResult的 AsyncWaitHandle屬性來獲取 Wait-Handle。異步調用完成時會發出WaitHandle信號,而您可以通過調用WaitOne方法等待它。如果您使用WaitHandle,則在異步調用完成之前或之后,在通過調用EndInvoke檢索結果之前,還可以執行其他處理。

2.5 輪詢異步調用完成

可以使用由BeginInvoke返回的 IAsyncResult的 IsCompleted屬性來發現異步調用何時完成。從用戶界面的服務線程中進行異步調用時可以執行此操作。輪詢完成允許調用線程在異步調用在ThreadPool線程上執行時繼續執行。

圖2 輪詢異步調用

2.6 異步調用完成時執行回調方法

如果啟動異步調用的線程不需要是處理結果的線程,則可以在調用完成時執行回調方法。回調方法在ThreadPool線程上執行。

若要使用回調方法,必須將引用回調方法的AsyncCallback委托傳遞給BeginInvoke。也可以傳遞包含回調方法將要使用的信息的對象。例如,可以傳遞啟動調用時曾使用的委托,以便回調方法能夠調用EndInvoke。

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

那些同時執行多項任務、但仍能響應用戶交互的應用程序通常需要實施一種使用多線程的設計方案。System.Threading命名空間提供了創建高性能多線程應用程序所必需的所有工具,但要想有效地使用這些工具,需要有豐富的使用多線程軟件工程的經驗。對于相對簡單的多線程應用程序,BackgroundWorker組件提供了一個簡單的解決方案。對于更復雜的異步應用程序,請考慮實現一個符合基于事件的異步模式的類。

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

基于事件的異步模式可以采用多種形式,具體取決于某個特定類支持的操作的復雜程度。最簡單的類可能只有一個MethodNameAsync方法和一個對應的 MethodNameCompleted事件。更復雜的類可能有若干個MethodNameAsync方法(每種方法都有一個對應的MethodNameCompleted事件),以及這些方法的同步版本。這些類分別支持各種異步方法的取消、進度報告和增量結果。

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

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

SoundPlayer和 PictureBox組件表示基于事件的異步模式的簡單實現。WebClient和BackgroundWorker組件表示基于事件的異步模式的更復雜的實現。

這里虛構的AsyncExample類有兩個方法,都支持同步和異步調用。同步重載的行為類似于方法調用,它們對調用線程執行操作;如果操作很耗時,則調用的返回可能會有明顯的延遲。異步重載將在另一個線程上啟動操作,然后立即返回,允許在調用線程繼續執行的同時讓操作“在后臺”執行。

3.3 異步方法重載

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

4 小結

異步編程是.NET Framework環境中高級開發的一種技術,系統了解異步編程對科研人員更好的掌握.NET Framework其內涵和原理有重要的理論價值和現實意義。

[1]Yack D.,Mayo J..ASP.NET 2.0編程珠璣:來自MVP的權威開發指南[M].北京:清華大學出版社,2006.

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

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

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

[5]張躍廷.ASP.NET開發實戰寶典[M].北京:清華大學出版社,2010.

[責任編輯:趙自謙]

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

曲衛華(1982-),男,山西靜樂人,工學碩士,太原大學計算中心助教。

猜你喜歡
方法
中醫特有的急救方法
中老年保健(2021年9期)2021-08-24 03:52:04
高中數學教學改革的方法
河北畫報(2021年2期)2021-05-25 02:07:46
化學反應多變幻 “虛擬”方法幫大忙
變快的方法
兒童繪本(2020年5期)2020-04-07 17:46:30
學習方法
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
最有效的簡單方法
山東青年(2016年1期)2016-02-28 14:25:23
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 538国产在线| 久久特级毛片| 57pao国产成视频免费播放| 久久精品午夜视频| 99在线国产| 97视频在线观看免费视频| 东京热一区二区三区无码视频| 美女一级毛片无遮挡内谢| 高清码无在线看| 国产成人精品优优av| 不卡无码网| 伊人久久久久久久| 中日无码在线观看| 手机在线免费不卡一区二| 国产一级妓女av网站| 亚洲欧美成人综合| 久久久久亚洲AV成人网站软件| 欧美一道本| 国产精品欧美在线观看| 国产亚洲精品自在线| h视频在线观看网站| 亚洲永久精品ww47国产| 亚洲乱强伦| 国产国产人在线成免费视频狼人色| 一级毛片不卡片免费观看| a欧美在线| 麻豆精品国产自产在线| 成人午夜网址| 久久久久人妻一区精品| 97无码免费人妻超级碰碰碰| 国产高清无码麻豆精品| 亚洲视频免费在线看| 毛片免费在线| a在线亚洲男人的天堂试看| 久久窝窝国产精品午夜看片| 性色在线视频精品| 亚洲成人www| 人妻中文字幕无码久久一区| 亚洲另类国产欧美一区二区| 日本人妻丰满熟妇区| 67194在线午夜亚洲| 女人av社区男人的天堂| 亚洲第一中文字幕| 麻豆国产在线不卡一区二区| 精品撒尿视频一区二区三区| 免费黄色国产视频| 91在线无码精品秘九色APP| 午夜限制老子影院888| 欧美日本不卡| 国产幂在线无码精品| 国产三级韩国三级理| 成人亚洲国产| 欧美日韩午夜| 99久久精品视香蕉蕉| 久久久久久久蜜桃| 91原创视频在线| 亚洲欧美日韩综合二区三区| 一级成人a毛片免费播放| 91成人在线免费视频| 国产99在线观看| 国产小视频网站| 国产三级毛片| 国产精品永久不卡免费视频 | 91精品国产一区| 国产女人18毛片水真多1| 久久激情影院| 无码视频国产精品一区二区| 特级做a爰片毛片免费69| 2021国产精品自拍| 女人18一级毛片免费观看| 99久久无色码中文字幕| 亚洲综合九九| 国产一二视频| 国产毛片高清一级国语| 国产午夜在线观看视频| V一区无码内射国产| 国产成人综合在线视频| 人妻一区二区三区无码精品一区 | 成人在线综合| 国产成人久久综合777777麻豆| 国产亚洲精品精品精品| 一级一毛片a级毛片|