在WCF中使用async/await 關鍵字的簡化的異步編程模型(譯)


最近困惑於如何用async/await 關鍵字去簡化wcf的調用,google了一下,找到一篇文章.

原文地址:http://blogs.msdn.com/b/endpoint/archive/2010/11/13/simplified-asynchronous-programming-model-in-wcf-with-async-await.aspx

 

在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會添加一個操作調用者到分發器,分發器將能處理基於任務的操作,並且將會以非常容易讓用戶察覺的方式完成所有工作.

客戶端

支持

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM