如若你觉得那件事儿没意义翻译的又差,在每一遍应该单独思考的时候

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

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

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

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

  那一个拉姆da有几许难以阅读,并且普通如若你使用多重的异步编制程序,你将索要过多拉姆da表明式相互嵌套,你的代码将会火速变得参差不齐和难以处理。

  小编意识那种方法比别的办法越来越易用。

最简便易行的异步情势

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

  在.NET功效中另3个异步形式设计IAsyncResult接口。当中一个事例正是DNS查找主机名的IP地址,BeginGetHoseAddress。那种规划须求三个艺术,3个是从头履行的BeginMethodName,另2个是实践截止EndMethodName,即你的回调方法。

接纳手写异步代码转换示例(第①章结尾一个示范)

  那种API是依照事件的异步形式(EAP)。那几个想法是想替代单线程方法去下载网页,即阻塞型代码会一贯等到下载截至再调用二个格局或接触2个事件。那个主意看起来和同步代码一样,除了无再次回到类型。这一个事件也有一个尤其的eventArgs类型,它包括值检索。

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

 

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

  当然,大家的真正属于一起的逻辑要被分为两个办法。小编不爱好使用Lambda来顶替刚才的EAP,因为lambda见面世在真的伊始下载前,笔者觉着这是不足读的。

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

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

第②4章 编写翻译器在底层为您的异步做了什么样

    .NET中的一些异步方式
    最简便的异步情势
    关于Task的介绍
    手动编写异步代码的标题
    行使手写异步代码转换示例(第②章结尾3个示范)

.NET中的一些异步方式

  在这个异步编制程序格局中,引发的另二个题材正是亟需费用大批量代码。倘诺您写一些异步代码,期望在任哪里方使用,你只可以提供API,假如API混乱可能忘记当时的初衷不可能分晓的话,将会两全其美。异步代码是会“传染”的,由此不但你必要异步API,还影响调用者和调用者的调用者,知道一切程序乱成一团。

  职分并行实在.NET
Framework4.0版本中出产的。其最要害的地点是Task类,即意味着2个正值履行的操作。
泛型版本的Task<T>, 当操作完毕时回来类型为T的值。

  笔者发觉那种方法比其余方法越来越易用。

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

第贰2章 ASP.NET应用中的异步编制程序

  当然,大家的着实属于一起的逻辑要被分为四个艺术。笔者不喜欢使用拉姆da来顶替刚才的EAP,因为lambda会出将来真的早先下载前,作者觉得那是不行读的。

.NET中的一些异步方式

  分歧于四个艺术的情势,像自个儿原先提到的,使用异步方法依然用lambda表达式做回调。它富有首要的利益便是能够在率先个法子中走访变量。

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

  那二种异步方式都亟需您分为多个艺术来书写。IAsyncResult格局要你从第3个格局中向第3个方法传递有个别参数,就如自个儿传递了string类型的”hello”。可是那种艺术很复杂,固然你不须求以此参数,依然只可以传递它,并且迫使你转移为object类型。

27号入职,花了二十四日的业余时间,坎坎坷坷的翻译了第叁章。假使您对您有点许益处,不要吝啬你的赞,给个鼓励。不确切和须求补给的地点,也请前辈们不吝赐教,作者将谦虚改正。下一章将会介绍 “编写Async方法

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

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

  Task的帮助和益处就像那么些DNS只需求3个主意,使API越发清洁。全部调用异步行为有关的逻辑都可在Task类个中,所以它不供给在每1个艺术里都进展复制。那些逻辑能够做过多生死攸关的事儿,比如拍卖很是和一块上下文(SynchronizationContexts)。那么些,大家将会在第拾章研商,对于在几个特定线程上进行callback很有用处(比如UI线程)。

 

写在前头

  哇!

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

 

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

  任务并行实在.NET
Framework4.0版本中出产的。其最重庆大学的地点是Task类,即意味着1个正在履行的操作。
泛型版本的Task<T>, 当操作完成时回来类型为T的值。

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

   在C#5.0
async成效上我们多量的选择了Task,大家将会稍后钻探。然则即便没有async,你照旧得以行使Task,尤其是采纳Task<T>来异步编制程序。那样做就行,你起来一个回到Task<T>的操作,然后接纳ContinueWith方法注册你的回掉方法。

  在.NET作用中另3个异步方式设计IAsyncResult接口。当中1个例证就是DNS查找主机名的IP地址,BeginGetHoseAddress。这种布署供给多个艺术,一个是始于履行的BeginMethodName,另二个是实践甘休EndMethodName,即你的回调方法。

第二5章 异步代码的性子

 

  这三种异步格局都亟需您分为七个方式来书写。IAsyncResult形式要你从第2个方法中向第二个法子传递有些参数,就如本身传递了string类型的”hello”。不过那种办法很复杂,尽管你不要求这些参数,依旧只好传递它,并且迫使你转移为object类型。

  至少那种艺术不会境遇残留注册事件的熏陶,然则那也非常的对API扩充了复杂。有三个办法而不是多个,小编觉得很不自然。

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

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

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

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

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

27号入职,花了四天的业余时间,坎坎坷坷的翻译了第1章。固然您对您多少许益处,不要吝啬你的赞,给个鼓励。不规范和须要补给的地点,也请前辈们不吝赐教,作者将谦虚校对。下一章将会介绍 “编写Async方法

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

第叁3章 WinOdysseyT应用中的异步编制程序

  再来谈谈第二章最终七个示范,我们谈论了贰个会因从网站下载icons,造成UI线程阻塞,并招致出现应用程序未响应的WPF
UI app。今后我们将会面到,将它转化成手写的异步代码。

  第首先要做的正是找到三个异步API的本子,小编用(WebClient。下载文件)。正如大家早已见到的,WebClient方法运用基于事件的异步格局(EAP),所以我们能够在上马下载从前注册一个事变视作回调方法。

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

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

  实际上那里还有另多个题材。我们已经说过调用1次异步方法的图景,不过当您需求多少个异步时会产生哪些吧?更不佳的是,假若弄须要在循环中调用异步又会发生如何吗?你为2个艺术是利用递归方法,那又比常常的轮回难以阅读多了。

  实际上那里还有另1个难点。大家已经说过调用3回异步方法的气象,可是当您供给四个异步时会发生哪些吧?更倒霉的是,要是弄需求在循环中调用异步又会生出什么样吗?你为1个艺术是使用递归方法,那又比一般的轮回难以阅读多了。

第09章 异步编程中的极度

第01章 异步编制程序介绍

  那种概括方法的毛病在于他们不再对调用者抛出十二分。在在此之前.NET异步编制程序中,调用EndMethodName只怕取得Result属性时,将会另行抛出非凡,所以在代码中大家能够对应的拍卖非凡。相反,他们或然在某些错误地点停下大概根本不去处理。

  那种简易方法的短处在于他们不再对调用者抛出11分。在以前.NET异步编制程序中,调用EndMethodName可能取得Result属性时,将会再也抛出格外,所以在代码中咱们得以对应的处理非凡。相反,他们只怕在有个别错误地点停下也许根本不去处理。

第八章 并行使用异步编制程序

最不难易行的异步格局

第03章 手动编写异步代码

关于Task的介绍

写在末端

  最注重的是,Task给大家提供一种选择异步的相对抽象的操作方法。大家得以应用那种组合型去编写大家的工具,即在广大亟待动用Task的情状下提供给一些管用的一言一动。大家将会晤到许多相关的工具组件(utilities)在第⑨章个中。

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

第05章 Await终归做了如何

  最根本的是,Task给大家提供一种采纳异步的相对抽象的操作办法。大家得以选取那种组合型去编写大家的工具,即在很多须要使用Task的情况下提要求一部分实用的作为。大家将会看到多如牛毛连锁的工具组件(utilities)在第楚辞当中。

  那种API是基于事件的异步情势(EAP)。这些想法是想替代单线程方法去下载网页,即阻塞型代码会一贯等到下载甘休再调用二个格局或接触二个轩然大波。这几个主意看起来和联合代码一样,除了无再次来到类型。那个事件也有2个专程的eventArgs类型,它涵盖值检索。

第04章 编写Async方法

第09章 异步编制程序中的极度

手动编写异步代码的题目

  在本章,我们将会切磋一些关于不使用C#5.0至关心爱抚要字async的异步编制程序。那种措施固然一度是病故的技艺,大概你不会再利用,但那对于你精通异步编制程序表象背后发生了何等工作是很主要的。也因为那或多或少,笔者将会神速的描述示例,仅仅器重揭穿出对你知道有赞助的地方。

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表明式作为回调,使你的代码一环套一环难以明白。

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

  那个拉姆da有少数难以阅读,并且普通倘使您使用多重的异步编制程序,你将索要过多拉姆da表明式互相嵌套,你的代码将会飞速变得参差不齐和难以处理。

第一4章 编写翻译器在头部为你的异步做了怎么

手动编写异步代码

第01章 异步编制程序介绍

  假设您觉得那件事儿没意义翻译的又差,尽情的踩吧。假使您以为值得鼓励,感激留下你的赞,愿爱技术的园友们在以后每1次应该能够突破的时候,不采用知难而退。在每回应该单独思考的时候,不选择随波逐流,应该奋力的时候,不选拔尽量,不辜负每一秒存在的意义。

  要是您以为这件事情没意义翻译的又差,尽情的踩吧。假如你认为值得鼓励,多谢留下你的赞,愿爱技术的园友们在此后每三次应该能够突破的时候,不选取知难而退。在每二遍应该单独思考的时候,不采用随俗浮沉,应该尽力的时候,不选用尽量,不辜负每一秒存在的意思。

 

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

 

  差别于七个办法的形式,像本身此前提到的,使用异步方法依旧用lambda表达式做回调。它具备重要的补益就是能够在首先个措施中访问变量。

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

关于Task的介绍

 

写在前面

第玖章 并行使用异步编程

  正如本人事先提到的,Silverlight只提供了像web访问的异步版本API。那里有一个事例,你能够下载多个网页,并展示它:

第03章 手动编写异步代码

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

第一5章 异步代码的习性

  至少那种方法不会惨遭残留注册事件的影响,然则这也13分的对API扩展了复杂。有三个格局而不是3个,笔者以为很不自然。

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

  Task的优点就好像这么些DNS只需求叁个主意,使API越发卫生。全体调用异步行为有关的逻辑都可在Task类当中,所以它不须求在每三个格局里都开始展览复制。那一个逻辑能够做过多注重的事情,比如拍卖非凡和协助进行上下文(SynchronizationContexts)。这个,我们将会在第⑧章探讨,对于在一个一定线程上推行callback很有用处(比如UI线程)。

第02章 为何接纳异步编制程序

  在本章,我们将会钻探一些关于不使用C#5.0注重字async的异步编制程序。这种方法固然曾经是病故的技巧,大概你不会再利用,但那对于你知道异步编制程序表象背后产生了怎么样工作是很重点的。也因为那或多或少,作者将会不慢的叙说示例,仅仅重视揭露出对你了然有扶持的地方。

   在C#5.0
async作用上大家大批量的应用了Task,我们将会稍后探讨。不过正是没有async,你仍是可以利用Task,特别是运用Task<T>来异步编制程序。那样做就行,你开端多个再次来到Task<T>的操作,然后利用ContinueWith方法注册你的回掉方法。

手动编写异步代码

目录

第07章 异步代码的局地工具

第04章 编写Async方法

第05章 Await毕竟做了怎么着

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

  
正如大家看来的,我们有见怪不怪情势来落到实处异步编制程序。有一些方法比任何格局整洁易懂易用,可是也期待您曾经见到他们共有的弱项。你打算写的程序不得不分为五个措施:实际的方法和回调方法。还有使用异步方法或嵌套数次lambda表达式作为回调,使您的代码一环套一环难以了然。

 

目录

  大家在调用那个法子前注册了风云。该措施即刻赶回,当然这是因为它是异步代码。然后在以后的某部时刻触发。那种格局分明很复杂,不仅仅是因为您要将它分为像例子一样的八个点子。最关键的是,你注册了三个光阴扩展了复杂。假使说笔者还要用平等的WebClient实例处理别的需求,那么您大概不希望以此时刻依旧被增大着还要再度实施二回。

  第首先要做的正是找到1个异步API的版本,笔者用(WebClient。下载文件)。正如小编辈曾经寓指标,WebClient方法应用基于事件的异步情势(EAP),所以大家得以在开头下载从前注册一个事件作为回调方法。

  哇!

第③3章 Win普拉多T应用中的异步编制程序

手动编写异步代码的标题

  大家在调用那些格局前注册了轩然大波。该方法立刻再次来到,当然那是因为它是异步代码。然后在以往的有些时刻触发。那种情势鲜明很复杂,不仅仅是因为您要将它分为像例子一样的三个措施。最重点的是,你注册了1个岁月扩张了复杂。借使说作者还要用同一的WebClient实例处理其余急需,那么您大概不希望以此小时照旧被增大着还要再一次实施三回。

  在学异步,有位园友推荐了《async in
C#5.0》,没找到中文版,恰巧也想增强下英文,用本人鸠拙的英文翻译一些重中之重的有些,纯属娱乐,简单分享,保持学习,谨记谦虚。

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

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

 

第叁2章 ASP.NET应用中的异步编制程序

第02章 为何使用异步编制程序

  在那么些异步编制程序情势中,引发的另二个题材便是亟需花费多量代码。假如您写一些异步代码,期望在任啥地点方使用,你只可以提供API,要是API混乱恐怕忘记当时的初衷无法分晓的话,将会一举两得。异步代码是会“传染”的,由此不但你需求异步API,还影响调用者和调用者的调用者,知道一切程序乱成一团。

 

写在后头

相关文章