最近困惑於如何用async/await 關鍵字去簡化wcf的調用,google了一下,找到一篇文章.
在WCF中管理多個異步的操作是普遍的讓人感到非常復雜,不管你是否使用了已存在的事件或者Begin/End異步的模式.實際上,內部的和外部的自定義的頻繁的任務,都存在關於怎么樣實現WCF多個操作之間的簡單協調的問題,甚至發送多個請求到WCF后端是核心場景.Wcf不能提供一個令人滿意的解決方案.需要的代碼數量促使甚至是簡單的協調任務都是一個很長的,而且容易出bug,還有錯誤處理和超時處理.有一些非常普通的面向通信的場景需要管理多個未解決的異步操作:
- 並行的執行多個異步操作,當他們所有的都完成以后再繼續,或者成功,失敗或者超時.
- 執行有序的異步操作,如果其中一個操作失敗或者超時就終止.
- 嵌套多個異步操作.
- 組合異步操作通過計時器方便的使用規定的間隔進行輪詢.
然而,不管目前的這些復雜性,WCF開發者不得不使用異步請求來寫健壯的實現,在今天做這件事實一個很困難的挑戰.
在PDC大會上,c#和VB.NET團隊發布了Visual Studio Async CTP,它意圖為所有做異步編程的語言提供一種新的簡化模型.在WCF中,我們已經決定采用這個模型,因為我們相信它移除了寫健壯的WCF異步操作應用程序的障礙,並且和現在的CLR APM模式有最小的學習曲線,然后對協調,提交和管理多個異步的WCf操作提供了一種簡單並且一致的模型.
接下來將在客戶端和服務端都采用異步模型,然后提供一些最常用的異步API的新的基於任務的重載:
服務端
WCF服務開發人員可能會定義異步操作契約,這個契約返回Task/Task<T>:
View Code
[ServiceContract]
public interface IServiceContract
{
[OperationContract]
Task<string> HelloAsync(string name);
}
可能你會注意到,不需要轉換任何操作契約,每一個異步模式都是true.或者定義Begin/End 方法對在你的服務契約中.
在服務器契約實現中,WCF服務開發者可能會實現作為一個異步方法去實現操作契約,然后創建一個新任務,例如:
View Code
namespace WCFServiceModelSamples
{
public class HelloService : IServiceContract
{
public async Task<string> HelloAsync(string name)
{
return await Task.Factory.StartNew(() => "hello " + name);
}
}
}
不需要明確的實現任何Begin/End方法,IAsyncResult 對象或者任何類型回調.內部的,WCF會添加一個操作調用者到分發器,分發器將能處理基於任務的操作,並且將會以非常容易讓用戶察覺的方式完成所有工作.
客戶端
支持
