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

大家纵观10年电商的开拓进取,从天猫,到天猫京东,再到去中央化;大家发现电有穷着那样的格局发展:

写在头里

流量-品质-个性。

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

电商1.0时期,“以货聚人”,“流量”是电商的最紧要,成就了天猫格局;

  假诺你以为这件事情没意义翻译的又差,尽情的踩吧。如若你认为值得鼓励,感谢留下您的赞,愿爱技术的园友们在后来每三遍应该能够突破的时候,不选用知难而退。在每三回应该单独思想的时候,不采纳随波逐流,应该大力的时候,不拔取尽量,不辜负每一秒存在的含义。

电商2.0时代,“以质聚人”,“质料”是电商的首要性,成就了京东、天猫情势;

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

电商3.0时日,“以人聚人”,“个性”是电商的要紧,成就了“去中央化”形式。

目录

说到即将赶到的去大旨化电商,我们顺说一下,什么是去中央化电商。

第01章 异步编程介绍

通俗点说,去核心化电商将突显在:

第02章 为啥采纳异步编程

一、基础设备一应俱全:

第03章 手动编写异步代码

网络、设备、平台、支付、物流、数据、金融、云总括等都成了基础服务;正品行货和高性价比已经变成同行业标配,用户不会再关注商品是否风格,价格是否方便,配送是否更快。基础设备的建设,已经主导满意公众对于以上的急需,进而进一步爱戴我的个性化需要。

    .NET中的一些异步格局
    最简单易行的异步格局
    关于Task的介绍
    手动编写异步代码的问题
    动用手写异步代码转换示例(第二章结尾一个演示)

二、社群及传统导向:

第04章 编写Async方法

用户不再围绕某大型购物平台展开集中化购物,而是围绕某个文化或价值观的辅导,形成某一个类的消费社群;以后的“需求”不再是工业时代的被“发现”或者“被知足”,不会再无停歇的迎合用户需要,而是不断的优化自己“价值观”,坚贞不屈团结的历史观,影响更多的用户来确认自己的思想意识。

第05章 Await究竟做了何等

三、工厂直达:

第06章
以Task为底蕴的异步格局

前景拥有的商品会间接从“工厂”到达“用户”手中,社群和传统将是中档的连接器。社群文化和历史观会依据自己的“价值观”输出自己在吃、穿、住、行,包括游览、娱乐等各样方面的商品或服务。

第07章 异步代码的片段工具

四、“内容”连接:

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

一个“内容”会对应多少个工厂,不同的厂子可以为这些“内容”服务,但是一类用户却相应一个“内容”,内容的“价值观”就是这么些群体的观念,所以是“内容”构建了全部用户的社群网络,即“人以人聚”。

第09章 异步编程中的异常

五、优化生产功能:

第10章 并行使用异步编程

因为去中央化的面世,和大气基础设备的公物,将来社会的运营本钱会越来越低,生产功能会越来越高。商品不会优先生产,只会等待用户预购之后才会启动生产,然后在最短的周期内送到用户手中

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

六、场景入口:

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

将来用户购物的景色可能在博客园、可能在微信、可能在直播平台,也恐怕在门口的便利店,只要能接二连三“用户”和“内容”要素的阳台都会成为一个购物平台,平台的品牌就是“内容”的品牌,不会再变成综合性公司的品牌,而购物的光景也不会只无线上,线上线下不会有肯定的无尽。

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

透过,大家得出,去中心化格局可以为电商解决如下问题:

第14章 编译器在底层为您的异步做了何等

1)用户没了选拔综合症,享受文化价值指导

第15章 异步代码的性能

用户不会再因为太多服装,而不知晓什么选取适合自己的衣裳;而是,参与某个社群,就快快迎合了这类社群的花费拔取,其格局、风格、色调都基本是类聚的。用户会把接纳商品的繁琐时间,转化到知识或价值的享受。

手动编写异步代码

2)行业运营效用大幅度提高

  在本章,大家将会谈谈一些关于不使用C#5.0着重字async的异步编程。这种格局虽然曾经是病故的技能,也许你不会再接纳,但这对于你明白异步编程表象背后发生了怎么着业务是很重大的。也因为这或多或少,我将会连忙的叙说示例,仅仅着重揭穿出对你理解有扶持的位置。

因为去核心化的前程采纳的是预售形式,所以基本都是按需生产,不会占有资金资产,那成本就足以流通在更有价值的地点,更快速的运作。同时没有铺货,就从未仓储库存的题材。

 

关于去要旨化电商说了那么多,那么微信小程序在去主旨化电商可以展现出哪些价值;微信的土壤,为何适合在未来的去中央化电商中崭露头角呢?

.NET中的一些异步格局

易小程(微信号:yixiaocheng100)将在明日的稿子中,给予完整解读;需要精晓的爱人,可以关注我们。

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

正文作者:易小程(全国超过的微信小程序技术服务商,yixiaocheng.com)

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;
}

微信公众号:晓晓程序

  这种API是遵照事件的异步情势(EAP)。那么些想法是想替代单线程方法去下载网页,即阻塞型代码会从来等到下载为止再调用一个措施或接触一个事变。那个办法看起来和一道代码一样,除了无重返类型。这多少个事件也有一个特意的eventArgs类型,它含有值检索。

原创内容,未经授权,不可转载!

  我们在调用那么些措施前注册了事件。该措施立时赶回,当然那是因为它是异步代码。然后在前几日的某个时刻触发。那种格局显明很复杂,不仅仅是因为您要将它分为像例子一样的两个模式。最要害的是,你注册了一个时间增多了复杂。假设说我还要用相同的WebClient实例处理任何需求,那么您或许不期待以此日子依旧被增大着还要再度实施一回。

  在.NET效能中另一个异步形式设计IAsyncResult接口。其中一个事例就是DNS查找主机名的IP地址,BeginGetHoseAddress。这种规划要求多少个法子,一个是发端进行的BeginMethodName,另一个是履行截至EndMethodName,即你的回调方法。

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扩展了复杂。有多个方法而不是一个,我觉得很不自然。

  这两种异步形式都需要你分为六个艺术来书写。IAsyncResult模式要你从第一个方法中向第二个方法传递某些参数,就像我传递了string类型的”hello”。可是这种方法很复杂,尽管你不需要以此参数,仍旧不得不传递它,并且迫使你转移为object类型。

 

最简易的异步形式

  可以说下边那段代码拥有异步行为,即便不行使async关键字,也不用向方法传递委托:

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

  我发觉那种方法比另外办法越来越易用。

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
...
});
}

  这些拉姆(Lamb)da有少数麻烦阅读,并且普通如若您选用多重的异步编程,你将需要广大兰姆(Lamb)da表明式互相嵌套,你的代码将会急迅变得犬牙交错和难以处理。

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

 

关于Task的介绍

  任务并行实在.NET
Framework4.0本子中推出的。其最着重的地点是Task类,即表示一个正在举行的操作。
泛型版本的Task<T>, 当操作完成时重返类型为T的值。

   在C#5.0
async效率上我们大量的使用了Task,我们将会稍后商讨。但是即使没有async,你照样可以利用Task,尤其是行使Task<T>来异步编程。这样做就行,你从头一个回去Task<T>的操作,然后利用ContinueWith方法注册你的回掉方法。

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

  Task的助益就像这多少个DNS只需要一个主意,使API更加清洁。所有调用异步行为有关的逻辑都可在Task类当中,所以它不需要在每一个形式里都开展复制。这个逻辑可以做过多至关重要的事儿,比如拍卖相当和协同上下文(SynchronizationContexts)。那一个,大家将会在第八章商量,对于在一个一定线程上实施callback很有用处(比如UI线程)。

  最重要的是,Task给我们提供一种接纳异步的对立抽象的操作办法。大家能够利用那种组合型去编写大家的工具,即在成千上万需要使用Task的动静下提供给一部分灵光的作为。咱们将会看到成千上万连锁的工具组件(utilities)在第七章当中。

 

手动编写异步代码的题材

  
正如大家看来的,大家有不少格局来贯彻异步编程。有一部分方法比其它艺术整洁易懂易用,但是也盼望您曾经见到他们共有的缺点。你打算写的程序不得不分为六个点子:实际的不二法门和回调方法。还有使用异步方法或嵌套多次lambda表明式作为回调,使您的代码一环套一环难以了然。

  实际上那里还有另一个问题。我们早就说过调用五次异步方法的状态,不过当你需要三个异步时会暴发什么呢?更糟糕的是,假若弄需要在循环中调用异步又会生出什么样啊?你为一个艺术是接纳递归方法,这又比日常的轮回难以阅读多了。

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);
}
});
}

  哇!

  在这些异步编程形式中,引发的另一个问题就是索要消耗大量代码。假如你写一些异步代码,期望在其余地方接纳,你不得不提供API,倘诺API混乱或者忘记当时的初衷不可以知道的话,将会事半功倍。异步代码是会“传染”的,由此不但你需要异步API,还影响调用者和调用者的调用者,知道整个程序乱成一团。

 

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

  再来谈谈第二章最终一个演示,我们谈论了一个会因从网站下载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方法