异步编程系列第03章 自己写异步代码

  WCF(Windows Communication
Foundation)是由微软开销的一多元扶助数据通讯的应用程序框架,可以翻译为Windows通讯开发平台

写在面前

  WCF整合了原本的Windows通信的.net Remoting
,WebService,Socket机制,并融合有HTTP和FTP的相干技能。WCF是对这一个技能的统一。

  在学异步,有位园友推荐了《async in
C#5.0》,没找到普通话版,恰巧也想提升下英文,用自身鸠拙的英文翻译一些要害的有些,纯属娱乐,简单分享,保持学习,谨记谦虚。

WCF的优点

  假若您认为那件事儿没意义翻译的又差,尽情的踩吧。如果你觉得值得鼓励,感谢留下您的赞,愿爱技术的园友们在后头每一遍应该可以突破的时候,不拔取知难而退。在每一遍应该单独思考的时候,不选拔随俗浮沉,应该努力的时候,不拔取尽量,不辜负每一秒存在的意思。

   统一性

  
转发和爬虫请注解原文链接http://www.cnblogs.com/tdws/p/5628538.html,博客园
蜗牛 2016年6月27日。

   互操作性

目录

   安全与可依靠

第01章 异步编程介绍

   兼容性

第02章 为何接纳异步编程

   

第03章 手动编写异步代码

知晓面向服务

    .NET中的一些异步方式
    最简便的异步方式
    关于Task的介绍
    手动编写异步代码的题材
    应用手写异步代码转换示例(第二章结尾一个示范)

   SOA(Service Oriented Atchitecture)面向服务架构
 。是指为了缓解在Internel环境下工作合并的必要,通过连接能成功一定任务的独自成效实体完毕的一种软件系统架构。SOA是一个零件模型,将应用程序的不比作用单元(称为服务)通过这几个服务时期定义出色的接口和契约关系起来

第04章 编写Async方法

 
 SOA提出近日系统应该丰盛灵活,从而允许在不打乱当前成功运行的系统布局和基础结构前提下,改动已有些连串布局。

第05章 Await究竟做了什么

   SOA有如下原则

第06章
以Task为底蕴的异步形式

       边界清楚

第07章 异步代码的一些工具

       服务自治

第08章 哪个线程在运转你的代码

       包容性基于政策

第09章 异步编程中的很是

       共享情势(schema)和契约

第10章 并行使用异步编程

 

第11章 单元测试你的异步代码

WCF框架组成

第12章 ASP.NET应用中的异步编程

   1.协定(契约)

第13章 WinRT应用中的异步编程

     
契约来定义双方联系的磋商,契约必须以接口的艺术来突显,而事实上的劳务代码必要求由这几个契约接口派生并完结,

第14章 编译器在底部为您的异步做了怎样

     契约可分为以下4种:

第15章 异步代码的质量

       1.数额契约(Data
Contract):指定双方关系时的多少格式

手动编写异步代码

       2.劳务契约(Service Contract):指定服务的定义

  在本章,大家将会谈谈一些有关不使用C#5.0紧要字async的异步编程。这种方式纵然早已是过去的技巧,也许你不会再选拔,但那对于你明白异步编程表象背后暴发了哪些业务是很重点的。也因为那或多或少,我将会很快的描述示例,仅仅爱慕揭穿出对你精通有接济的地点。

       3.操作契约(Opration Contract):指定服务提供的格局

 

       4.音信契约(MessageContract):指定在通讯时期改写音讯内容的正统

.NET中的一些异步形式

       契约定义信息系统的种种方面

  正如我后边涉嫌的,Silverlight只提供了像web访问的异步版本API。那里有一个事例,你可以下载一个网页,并展现它:

          (1).数据契约:服务中的参数

private void DumpWebPage(Uri uri)
{
WebClient webClient = new WebClient();
webClient.DownloadStringCompleted += OnDownloadStringCompleted;
webClient.DownloadStringAsync(uri);
}
private void OnDownloadStringCompleted(object sender,
DownloadStringCompletedEventArgs eventArgs)
{
m_TextBlock.Text = eventArgs.Result;
}

          (2).音讯契约:使用SOAP协议一定的新闻部分

  那种API是按照事件的异步方式(EAP)。那几个想法是想替代单线程方法去下载网页,即阻塞型代码会一贯等到下载截至再调用一个方法或接触一个事变。那几个措施看起来和同步代码一样,除了无重临类型。这一个事件也有一个特意的eventArgs类型,它包括值检索。

          (3).服务契约:服务中的方法

  我们在调用这么些法子前注册了风波。该措施立时赶回,当然那是因为它是异步代码。然后在将来的某部时刻触发。那种情势鲜明很复杂,不仅仅是因为您要将它分为像例子一样的五个方法。最关键的是,你注册了一个时刻扩展了复杂。假诺说我还要用相同的WebClient实例处理其他需要,那么您或许不期待以此时刻如故被增大着还要再度实施两回。

         
(4).策略与绑定:策略设置安全或别的条件,绑定指定传输情势与编码。

  在.NET作用中另一个异步格局设计IAsyncResult接口。其中一个事例就是DNS查找主机名的IP地址,BeginGetHoseAddress。这种规划须求四个格局,一个是从头实施的BeginMethodName,另一个是举行停止EndMethodName,即你的回调方法。

   2.劳动运作

private void LookupHostName()
{
object unrelatedObject = "hello";
Dns.BeginGetHostAddresses("oreilly.com", OnHostNameResolved, unrelatedObject);
}
private void OnHostNameResolved(IAsyncResult ar)
{
object unrelatedObject = ar.AsyncState;
IPAddress[] addresses = Dns.EndGetHostAddresses(ar);
// Do something with addresses
...
}

      服务运作时期的一言一动控制

  至少那种办法不会境遇残留注册事件的影响,可是那也格外的对API伸张了复杂。有多少个法子而不是一个,我觉着很不自然。

          (1).限制行为:控制处理的新闻数

  那两种异步情势都亟待你分为四个办法来书写。IAsyncResult情势要你从第三个点子中向第一个主意传递某些参数,就如本人传递了string类型的”hello”。可是那种办法很复杂,纵然你不须求这么些参数,仍旧不得不传递它,并且迫使你转移为object类型。

          (2).错误行为:出现其中错误时所拍卖的操作

 

          (3).元数据表现:是或不是向外提供元数据及元数据的提供情势

最简单易行的异步情势

          (4).实例行为:可运行的劳务实例数目

  可以说上面这段代码拥有异步行为,就算不使用async关键字,也不用向方法传递委托:

          (5).事务行为:处监护人务

void GetHostAddress(string hostName, Action<IPAddress> callback)

          (6).调度行为:控制WCF处理信息的方法

  我意识那种情势比任何格局更为易用。

   3.音讯传递

private void LookupHostName()
{
GetHostAddress("oreilly.com", OnHostNameResolved);
}
private void OnHostNameResolved(IPAddress address)
{
// Do something with address
...
}

     
 新闻传递层表明数据的置换格式和传导格局。信息传递层由通道(信道)组成,通道是对音信举行处理的零部件,负责以同一的法子对音讯进行整理和传递。通道用于传输层,协议层及音信获得。各层次的大路组成了信道栈

  不一致于三个点子的形式,像本人原先提到的,使用异步方法依然用lambda表达式做回调。它有着紧要的补益就是可以在首先个措施中访问变量。

     
 通道对音信和音信头进行操作,服务运行时对音信正文举办操作。通道包涵二种档次:传输通道与协和通道。

private void LookupHostName()
{
int aUsefulVariable = 3;
GetHostAddress("oreilly.com", address =>
{
// Do something with address and aUsefulVariable
...
});
}

             
传输通道:读取和写入来自网络的新闻,传输通道通过编码器将音讯转换为网络传输使用的字节流以及将字节流转换为音信。传输通道蕴涵HTTP通道,命名管道,TCP,MSMQ等

  那么些Lambda有一些麻烦阅读,并且普通若是您采纳多重的异步编程,你将需求广大Lambda表达式互相嵌套,你的代码将会很快变得犬牙相错和难以处理。

              协议通道:通过读取或写入新闻头的法门来完成信息协议。比如
WS-Security。WS-Reliability

  那种简单方法的瑕疵在于他们不再对调用者抛出分外。在从前.NET异步编程中,调用EndMethodName或者取得Result属性时,将会重复抛出相当,所以在代码中大家可以对应的处理非凡。相反,他们唯恐在某个错误地点停下或者根本不去处理。

   4.宿主与激活

 

       
 服务宿主负责WCF服务的生命周期和上下文的操作系统进度,负责启动和终止WCF服务,并提供控战胜务的为CEO理效果。

关于Task的介绍

 

  义务并行实在.NET
Framework4.0本子中生产的。其最要紧的地点是Task类,即表示一个正在履行的操作。
泛型版本的Task<T>, 当操作已毕时重回类型为T的值。

WCF的底蕴概念

   在C#5.0
async成效上我们多量的选用了Task,大家将会稍后探讨。然则尽管没有async,你如故得以行使Task,越发是采纳Task<T>来异步编程。那样做就行,你开首一个赶回Task<T>的操作,然后利用ContinueWith方法注册你的回掉方法。

     1.地址

private void LookupHostName()
{
Task<IPAddress[]> ipAddressesPromise = Dns.GetHostAddressesAsync("oreilly.com");
ipAddressesPromise.ContinueWith(_ =>
{
IPAddress[] ipAddresses = ipAddressesPromise.Result;
// Do something with address
...
});
}

      2.绑定(Binding)

  Task的优点就如那些DNS只须要一个格局,使API尤其卫生。所有调用异步行为有关的逻辑都可在Task类当中,所以它不要求在每一个主意里都举办复制。这一个逻辑可以做过多主要的事宜,比如拍卖极度和同步上下文(SynchronizationContexts)。这几个,大家将会在第八章钻探,对于在一个一定线程上实施callback很有用处(比如UI线程)。

      3.契约(Contract)

  最根本的是,Task给大家提供一种选拔异步的相对抽象的操作方法。大家得以选择那种组合型去编写大家的工具,即在诸多亟待选用Task的图景下提需要一些实用的行为。大家将相会到多如牛毛连锁的工具组件(utilities)在第七章当中。

      4.终结点

 

       
 用来发送或接受消息(或施行那两种操作)的布局,终结点包罗一个概念信息可以发送在的目标地地方节点,蕴含一个概念信息可以发送到的目的地地点(地址),一个叙述信息应怎么样发送的通信机制规范(绑定)以及对此可以在该职务发送或收到(或二者皆可)的一组消息的概念(服务协定)—该定义还描述了能够发送何种信息

手动编写异步代码的标题

       
终结点的地址由EndpointAddress类表示,该类包括一个代表服务地址额统一资源一定符(URI),超过半数传输的地方URI包涵4部分。

  
正如我们见到的,大家有广大方法来完成异步编程。有局地办法比其余措施整洁易懂易用,可是也愿意你早就观察他们共有的毛病。你打算写的先后不得不分为八个艺术:实际的章程和回调方法。还有使用异步方法或嵌套数十次lambda表明式作为回调,使你的代码一环套一环难以知晓。

     
 例:https://home.cnblogs.com/u/1147658/

  实际上那里还有另一个标题。我们早已说过调用三次异步方法的情况,然而当您要求多少个异步时会爆发怎么着吗?更糟糕的是,如果弄须求在循环中调用异步又会发出什么吧?你为一个方法是选取递归方法,那又比普通的巡回难以阅读多了。

           方案:https

private void LookupHostNames(string[] hostNames)
{
LookUpHostNamesHelper(hostNames, 0);
}

private static void LookUpHostNamesHelper(string[] hostNames, int i)
{
Task<IPAddress[]> ipAddressesPromise = Dns.GetHostAddressesAsync(hostNames[i]);
ipAddressesPromise.ContinueWith(_ =>
{
IPAddress[] ipAddresses = ipAddressesPromise.Result;
// Do something with address
...
if (i + 1 < hostNames.Length)
{
LookUpHostNamesHelper(hostNames, i + 1);
}
});
}

           计算机:home.cnblogs.com

  哇!

           端口(可选):

  在这几个异步编程格局中,引发的另一个难题就是亟需消耗大量代码。若是您写一些异步代码,期望在其余地点采用,你不得不提供API,即使API混乱或者忘记当时的初衷不可以领会的话,将会一举两得。异步代码是会“传染”的,因而不但你必要异步API,还影响调用者和调用者的调用者,知道整个程序乱成一团。

           路径:u/147658

 

      5.元数据

运用手写异步代码转换示例(第二章结尾一个演示)

      6.宿主(Host)

  再来谈谈第二章最后一个示范,大家研讨了一个会因从网站下载icons,造成UI线程阻塞,并促成出现应用程序未响应的WPF
UI app。现在大家将会看到,将它转化成手写的异步代码。

  第首先要做的就是找到一个异步API的版本,我用(WebClient。下载文件)。正如我辈早就观看的,WebClient方法应用基于事件的异步形式(EAP),所以大家得以在开班下载之前注册一个风云作为回调方法。

private void AddAFavicon(string domain)
{
WebClient webClient = new WebClient();
webClient.DownloadDataCompleted += OnWebClientOnDownloadDataCompleted;
webClient.DownloadDataAsync(new Uri("http://" + domain + "/favicon.ico"));
}
private void OnWebClientOnDownloadDataCompleted(object sender,
DownloadDataCompletedEventArgs args)
{
Image imageControl = MakeImageControl(args.Result);
m_WrapPanel.Children.Add(imageControl);
}

  当然,我们的真的属于一起的逻辑要被分为三个方法。我不喜欢使用Lambda来代表刚才的EAP,因为lambda会出现在真正初叶下载前,我觉得那是不可读的。

  那个本子的以身作则也足以在线(https://bitbucket.org/alexdavies74/faviconbrowser)找到,(//译者注释:不运行此程序也没关系,主要是体会下思路就好)在manual分支。如果你运行它,不进界面可相应,图标也会逐一出现。正因此,我们也引入了一个bug,现在由于所有下载操作同时开始,icons的排序由其下载先后决定,而不是由我的先后请求来决定。如果你想检验自己是否理解手动编写异步代码,我建议你尝试着解决此bug。在orderedManual分支下(上面列出的站点下)提供了一个解决方案。其他更有效的解决方案也是有可能的。

写在后头

27号入职,花了三日的业余时间,坎坎坷坷的翻译了第三章。倘诺你对你稍微许益处,不要吝啬你的赞,给个鼓励。不纯粹和内需补充的地方,也请前辈们不吝赐教,我将谦虚校正。下一章将会介绍 “编写Async方法