WCF異步操作具體定義與應用
如果想要熟練的應用WCF開發工具,就需要在學習與實踐的過程中去掌握那些重要的應用技巧。在這里我們就先為大家介紹一下有關WCF異步操作的相關應用技巧,以方便大家在實際應用中獲得些幫助。
實現WCF異步操作模式在編程上具有一些限制:異步服務操作是通過兩個配對的方法實現的,并且采用典型的異步操作命名方式:BeginXxx/EndXxx。兩個方法需要采用如下的簽名,指定了AsyncPattern屬性的OperationContractAttribute只需要應用到BeginXxx方法上面。
- [OperationContract(AsyncPattern = true)]
- IAsyncResult BeginDoWork(parameters, AsyncCallback
userCallback, object stateObject);- ReturnType EndDoWork(IAsyncResult asynResult);
比如下面兩段代碼可以看作相同的操作在同步和異步下的不同表現。
- [OperationContract]
- double Add(double x, double y);
- [OperationContract(AsyncPattern = true)]
- IAsyncResult BeginAdd(double x, double y,
AsyncCallback userCallback, object stateObject);- double EndAdd(IAsyncResult asynResult);
理解了WCF異步操作的定義模式之后,我們來談談WCF異步操作實現的原理。WCF通過類型OperationDescription表示對服務操作的描述。如下面的代碼所示,OperationDescription具有3個重要的MemthodInfo類型的屬性成員:SyncMethod、BeginMethod和EndMethod,分別表示同步方法、異步開始和結束方法。以上面的代碼為例,如果采用SyncMethod表示Add方法,而BeginMethod和EndMethod對應于BeginAdd和EndAdd方法。
- public class OperationDescription
- {
- public MethodInfo SyncMethod { get; set; }
- public MethodInfo BeginMethod { get; set; }
- public MethodInfo EndMethod { get; set; }
- //其他成員
- }
WCF通過OperationSelector選擇相應的操作,通過OperationInvoker執行被選擇操作對應的方法。所有的OperationInvoker都實現了接口System.ServiceModel.Dispatcher.IOperationInvoker。下面是IOperationInvoker基本的定義。Invoke和InvokeBegin/InvokeEnd代表對操作同步和異步執行,IsSynchronous表示當前操作是否是異步的,如果操作的AsyncPattern為true則表明是異步操作。
- public interface IOperationInvoker
- {
- object[] AllocateInputs();
- object Invoke(object instance, object[] inputs,
out object[] outputs);- IAsyncResult InvokeBegin(object instance, object[] inputs,
AsyncCallback callback, object state);- object InvokeEnd(object instance, out object[] outputs,
IAsyncResult result);- bool IsSynchronous { get; }
- }
在WCF中定義了兩個典型的OperationInvoker:SyncOperationInvoker與AsyncOperationInvoker,它們分別用于同步操作和異步操作的執行。這兩個OperationINvoker均實現了IOperationInvoker接口,SyncOperationInvoker實現了Invoke方法,AsyncOperationInvoker實現了InvokeBegin和InvokeEnd
當通過OperationSelector和InstanceProvider選出正確的方法和得到相應的服務實例的時候,WCF根據操作的AsyncPattern選擇相應的OperationInvoker。如果是同步的則自然選擇SyncOperationInvoker,執行Invoke方法。Invoke方法會通過OperationDescription的SyncMethod屬性,得到同步操作方法的MethodInfo,采用反射的機制執行該方法;對于WCF異步操作,則會調用AsyncOperationInvoker的InvokeBegin和InvokeEnd方法,InvokeBegin和InvokeEnd方法對應的MethodInfo通過OperationDescription的BeginMethod和EndMethod屬性獲得。得到相應的MethodInfo對象后,同樣通過反射調用服務實例。
【編輯推薦】