zoukankan      html  css  js  c++  java
  • 在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会添加一个操作调用者到分发器,分发器将能处理基于任务的操作,并且将会以非常容易让用户察觉的方式完成所有工作.

    客户端

    支持

  • 相关阅读:
    Sicily 1153. 马的周游问题 解题报告
    回溯法与八皇后问题
    Sicily 1151. 魔板 解题报告
    Sicily 1176. Two Ends 解题报告
    Sicily 1046. Plane Spotting 解题报告
    Java多线程11:ReentrantLock的使用和Condition
    Java多线程10:ThreadLocal的作用及使用
    Java多线程9:ThreadLocal源码剖析
    Java多线程8:wait()和notify()/notifyAll()
    Java多线程7:死锁
  • 原文地址:https://www.cnblogs.com/xiaobaihome/p/2302523.html
Copyright © 2011-2022 走看看