天天看點

WCF技術剖析之十一:異步操作在WCF中的應用(下篇)

一、異步操作的定義和實作原理

實作WCF異步服務操作模式在程式設計上具有一些限制:異步服務操作是通過兩個配對的方法實作的,并且采用典型的異步操作命名方式:BeginXxx/EndXxx。兩個方法需要采用如下的簽名,指定了AsyncPattern屬性的OperationContractAttribute隻需要應用到BeginXxx方法上面。

比如下面兩段代碼可以看作相同的操作在同步和異步下的不同表現。

了解了異步操作的定義模式之後,我們來談談WCF異步操作實作的原理。WCF通過類型OperationDescription表示對服務操作的描述。如下面的代碼所示,OperationDescription具有3個重要的MemthodInfo類型的屬性成員:SyncMethod、BeginMethod和EndMethod,分别表示同步方法、異步開始和結束方法。以上面的代碼為例,如果采用SyncMethod表示Add方法,而BeginMethod和EndMethod對應于BeginAdd和EndAdd方法。

WCF通過OperationSelector選擇相應的操作,通過OperationInvoker執行被選擇操作對應的方法。所有的OperationInvoker都實作了接口System.ServiceModel.Dispatcher.IOperationInvoker。下面是IOperationInvoker基本的定義。Invoke和InvokeBegin/InvokeEnd代表對操作同步和異步執行,IsSynchronous表示目前操作是否是異步的,如果操作的AsyncPattern為true則表明是異步操作。

在WCF中定義了兩個典型的OperationInvoker:SyncOperationInvoker與AsyncOperationInvoker,它們分别用于同步操作和異步操作的執行。這兩個OperationINvoker均實作了IOperationInvoker接口,SyncOperationInvoker實作了Invoke方法,AsyncOperationInvoker實作了InvokeBegin和InvokeEnd

當通過OperationSelector和InstanceProvider選出正确的方法和得到相應的服務執行個體的時候,WCF根據操作的AsyncPattern選擇相應的OperationInvoker。如果是同步的則自然選擇SyncOperationInvoker,執行Invoke方法。Invoke方法會通過OperationDescription的SyncMethod屬性,得到同步操作方法的MethodInfo,采用反射的機制執行該方法;對于異步操作,則會調用AsyncOperationInvoker的InvokeBegin和InvokeEnd方法,InvokeBegin和InvokeEnd方法對應的MethodInfo通過OperationDescription的BeginMethod和EndMethod屬性獲得。得到相應的MethodInfo對象後,同樣通過反射調用服務執行個體。

二、如何建立異步服務

在了解了異步操作的定義和具體的實作原理之後,我們通過一個簡單的執行個體示範異步操作在WCF應用中的實作。本例子中,我們通過服務調用來讀取服務端的檔案,在實作檔案讀取操作的時候,采用異步檔案讀取方式。

先來看看服務契約的定義。服務契約通過接口IFileReader定義,基于檔案名的檔案讀取操作以異步的方式定義在BeginRead和EndRead方法中。

FileReader實作了契約契約,在BeginRead方法中,根據檔案名稱建立FileStream對象,調用FileStream的BeginRead方法實作檔案的異步讀取,并直接傳回該方法的執行結果:一個IAsyncResult對象。在EndRead方法中,調用FileStream的EndRead讀取檔案内容,并關閉FileStream對象。

采用傳統的方式寄宿該服務,并釋出中繼資料。在用戶端通過添加服務引用的方式生成相關的服務代理代碼和配置。你将會發現用戶端生成的服務契約和服務代理類中,會有一個唯一的操作Read。也就是說,不管服務采用同步模式還是異步模式實作,對用戶端的服務調用方式沒有任何影響,用戶端可以任意選擇相應的模式進行服務調用。

直接借助于生成的服務代理類FileReaderClient,服務調用的代碼就顯得很簡單了。

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

繼續閱讀