最近困惑于如何用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会添加一个操作调用者到分发器,分发器将能处理基于任务的操作,并且将会以非常容易让用户察觉的方式完成所有工作.

客户端

支持

 

 

 

 

 

 

 

 

 

 

posted on 2011-12-26 20:47  xjbest  阅读(3676)  评论(1编辑  收藏  举报