WCF異步操作具體定義與應用
如果想要熟練的應用WCF開發(fā)工具,就需要在學習與實踐的過程中去掌握那些重要的應用技巧。在這里我們就先為大家介紹一下有關WCF異步操作的相關應用技巧,以方便大家在實際應用中獲得些幫助。
實現(xiàn)WCF異步操作模式在編程上具有一些限制:異步服務操作是通過兩個配對的方法實現(xiàn)的,并且采用典型的異步操作命名方式:BeginXxx/EndXxx。兩個方法需要采用如下的簽名,指定了AsyncPattern屬性的OperationContractAttribute只需要應用到BeginXxx方法上面。
- [OperationContract(AsyncPattern = true)]
- IAsyncResult BeginDoWork(parameters, AsyncCallback
userCallback, object stateObject);- ReturnType EndDoWork(IAsyncResult asynResult);
比如下面兩段代碼可以看作相同的操作在同步和異步下的不同表現(xiàn)。
- [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異步操作實現(xiàn)的原理。WCF通過類型OperationDescription表示對服務操作的描述。如下面的代碼所示,OperationDescription具有3個重要的MemthodInfo類型的屬性成員:SyncMethod、BeginMethod和EndMethod,分別表示同步方法、異步開始和結(jié)束方法。以上面的代碼為例,如果采用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執(zhí)行被選擇操作對應的方法。所有的OperationInvoker都實現(xiàn)了接口System.ServiceModel.Dispatcher.IOperationInvoker。下面是IOperationInvoker基本的定義。Invoke和InvokeBegin/InvokeEnd代表對操作同步和異步執(zhí)行,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,它們分別用于同步操作和異步操作的執(zhí)行。這兩個OperationINvoker均實現(xiàn)了IOperationInvoker接口,SyncOperationInvoker實現(xiàn)了Invoke方法,AsyncOperationInvoker實現(xiàn)了InvokeBegin和InvokeEnd
當通過OperationSelector和InstanceProvider選出正確的方法和得到相應的服務實例的時候,WCF根據(jù)操作的AsyncPattern選擇相應的OperationInvoker。如果是同步的則自然選擇SyncOperationInvoker,執(zhí)行Invoke方法。Invoke方法會通過OperationDescription的SyncMethod屬性,得到同步操作方法的MethodInfo,采用反射的機制執(zhí)行該方法;對于WCF異步操作,則會調(diào)用AsyncOperationInvoker的InvokeBegin和InvokeEnd方法,InvokeBegin和InvokeEnd方法對應的MethodInfo通過OperationDescription的BeginMethod和EndMethod屬性獲得。得到相應的MethodInfo對象后,同樣通過反射調(diào)用服務實例。
【編輯推薦】