葡京娱乐场注册黄昏

余晖及路灯相得益彰

写于前头

余晖下之桥

  于法异步,有各项园友推荐了《async in
C#5.0》,没找到中文版,恰巧也想提高下英文,用自身拙劣的英文翻译一些最主要之片,纯属娱乐,简单分享,保持上,谨记谦虚。

余晖下的桥

  如果您以为这桩事儿没意义翻译的还要不同,尽情的践踏吧。如果您当值得鼓励,感谢留下您的歌颂,愿爱技术的园友们在随后每一样次当可以突破之上,不拣知难而退。在各个一样浅当单独思想的时候,不选以波逐流,应该奋力的时刻,不选择尽量,不辜负每一样秒存在的意思。

夕阳

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

右的日光快要落山了

葡京娱乐场注册 1

太阳了获得下来

目录

霞光

第01回 异步编程介绍

霞光

第02章 为什么用异步编程

阴出来了

第03段 手动编写异步代码

路灯及塑造

第04章 编写Async方法

路灯和培养

第05节 Await究竟做了什么

糊掉的仅

第06章节
以Task为根基的异步模式

拼图

第07节 异步代码的片器

拼图

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

连日来的阴雨后终于迎来了一个特别晴天,回家之中途霞光与周景相互搭配,甚是怡人。

第09节 异步编程中之万分

自家将打好的照片发给一个对象,她说自脑子里每天都发生有趣的从业。听后不解,她讲道,她以为自己发生多之自家娱乐,大意就是当百凭聊赖之中通过录像自我娱乐,听后不深感概。的确,日复一日重的活着被人口累麻木,一直怀念去的地方吧尚从未失去。因为有些有血有肉的束缚,这样的存不够日里无法改变。既然小无法转移,何不自己打造一些意,看看身边的光景,也许也撩人呢。

第10段 并行使用异步编程

看这黄昏之美景,禁不住停下来拍照。我见过往的游子车辆形色匆匆,而这时候自家独立享这黄昏静静的怡人的景,想来也是相同种简易的甜美。当自身无法去旅行,停下来看看身边的风物啊不易。

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

傍晚重抖终要黑夜,但那还要怎,黑夜之后,黎明的曙光终见面出现在东方。不同时段来差的得意,不同地方产生例外之特性。

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

哪怕黑暗且赶到,黄昏吗一直最特别之极力带动最好的漂亮。即使这无那么合意,也努力活吧。

第13章节 WinRT应用被的异步编程

末段,送下就张图于张这里的君。

第14回 编译器在脚为你的异步做了啊

甘当你相只有

第15章节 异步代码的性能

await究竟做了哟?

  我们出三三两两种角度来看待C#5.0的async功能特色,尤其是await关键字上发出了什么:

  ·作为一个语言的力量特色,他是一个供应您学习的已经定义好之作为

  ·作为一个在编译时的换,这是一个C#语法糖,为了简略之前复杂的异步代码

  这都是的确;它们就是比如相同朵硬币的片迎。在本章,我们用会见集中在首先沾达成来探讨异步。在次十四章咱俩用会见起外一个角度来探讨,即再复杂的,但是提供了一些细节而debug和属性考虑越来越鲜明。

休眠和提醒一个法

   当你的程序执行遇到await关键字时,我们怀念如果发两起事:

  
·为了使您的代码异步,当前施行你代码的线程应该于放走。这表示,在通常,同步的角度来拘禁,你的方式应该回到。

  
·当你await的Task完成时,你的办法应该由前面的职务连续,就如其并未当早些时候被归。

  为了好这个行为,你的道要在撞await时刹车,然后以未来底之一时刻恢复执行。

  我将这进程作为一个休眠一宝计算机的多少框框情况来拘禁(S4
sleep)。这个法当前底状态会让储存起来(译者:状态存储起来,正如我们第二节厨房特别例子,厨师会管早已位居烤箱中之食的烹饪状态为标签的形式贴在地方),并且这个措施了脱离(厨师走了,可能失去做任何作业了)。当一玉电脑休眠,计算机的动态数据和运转数据让保存到磁盘,并且变得全关闭。下面这段话和计算机休眠大概一个理,一个正await的方式除了用一点内存,不以其它资源,那么可以作为是刚刚推行之线程已经被假释。

      
进一步用类似上平等段落的好像比较:一个阻塞型方法更如你暂停一光电脑(S3
sleep),它虽然采用比较少之资源,但从根本上来讲它直接在运作着。

  于帅之状况下,我们希望编程者察觉不至此处的休眠。尽管实际上休眠和提示一个方式的中期实施是那个复杂的,C#也以见面确保您的代码被唤起,就比如什么还不曾出同样。(译者:不得不赞叹微软本着语法糖的包裹和处理)。

方法的状态

  为了规范之肇明白在你使用await时C#究竟为我们开了有些事情,我想列有具有有关艺术状态的拥有我们记住和了解之底细。

  首先,你道吃本地的变量的值会被铭记,包括以下值:

  ·你方的参数

  ·在本范围外装有你定义之变量

  ·其他变量包括循环数

  ·如果你的章程非静态,那么连this变量。这样,你好像的积极分子变量在方式唤醒时还是可用的。

  他们都吃存在.NET
垃圾回收堆(GC堆)的一个对象及。因此当你下await时,一个吃一些资源的对象将会给分配,但是以大部场面下未用担心性能问题。

  C#为会铭记在措施的什么位置会履行及await。这足以利用数字存储起来,用来表示await关键字于现阶段法的职务。

  于有关如何以await关键字没什么特别之限制,例如,他们可以叫用当一个增长表达式上,可能含不止一个await:

int myNum = await AlexsMethodAsync(await myTask, await StuffAsync());

  为了错开记住剩余部分的表达式的状态在await某些事物常常,增加了附加的格。比如,当我们运行await
StuffAsync()时,await
myTask的结果要吃记住。.NET中间语言(IL)在栈上存储这种子类表达式,因此
,这个库房就是我们await关键字需要仓储的。

  最重点之是,当程序执行到第一单await关键字时,方法就归了(译者:关于艺术在撞await时回来,建议读者从第一节拆分的少数个点子来喻)。如果其不是一个async
void方法,一个Task在斯时刻被归,因此调用者可以等待我们因为某种方式完成。C#为务必存储一栽操作返回的Task的方法,这样当你的法子就,这个Task也变得completed,并且执行者也得以回到到方式的异步链当中。确切的建制将会见于第十四节中介绍。

上下文

  作为一个如await的长河尽量透明底一些,C#捕捉各种上下文在遇见await时,然后于恢复措施要将那回复。

  以具备业务被极重大的要同上下文(synchronization
context),即好于用于恢复措施以一个非正规类型的线程上。这对UI
app尤其关键,就是那种只能在对的线程上操作UI的(就是winform
wpf之类的)。同步上下文是一个错综复杂的话题,第八章用会见详细分解。

  其他种类的上下文也会叫于此时此刻调用的线程捕捉。他们之决定是经一个等同名称的好像来落实之,所以自己拿列出一些重中之重之内外文类型:

  ExecutionContext

  这是父级上下文,所有其他上下文都是它的同一片。这是.NET的体系功能,如Task使用那捕捉与传颂上下文,但是它本身不包含什么行为。

  SecurityContext

  这是咱发现并找到日常给限定以眼前线程的安全信息之地方。如果您的代码需要周转在一定的用户,你或许会,模拟或去这个用户,或者ASP.NET将会帮您兑现扮演。在这种情况下,模拟信息会在SecurityContext。

  CallContext(这个事物耳熟能详吧,相信用过EF的还明白)

  这允许编程者存储他们于逻辑线程的生命周期中直接可用之数码。即使考虑到在群场面下起不好的见,它还可以免程序中艺术的参数传来传去。(译者:因为您抱到callcontext里,随时都得拿走呀,不用经过污染参数传来传去矣)。LogicalCallContextis是一个连锁的好跨用应用程序域的。

      
值得注意的是线程本地存储(TLS),它和CallContext的目标一般,但其当异步的状下是勿做事的,因为在一个耗时操作着,线程被释放掉了,并且可能让用来拍卖任何工作了。你的艺术或者让提拔并施行于一个例外之线程上。

  C#以见面在您道恢复(resume,这里虽是独的“恢复”)的上恢复(restore,我认为这里指从内存中还原)这些类别的上下文。恢复上下文将产生一些付出,比如,一个程序于利用模拟(之前的学身份之类的)的时光并大方应用async将见面转移得重缓慢有。我建议一定变.NET创建上下文的法力,除非你觉得这真发生必不可少。

await能为此在哪儿?

  await可以据此当其它标记async的措施及与方法外大部分之地方,但是来一对地方你切莫可知为此await。我拿解释为何当某些情况下未允许await。

catch和finally块

  虽然在try块中以await是意同意的,但是他未允以catch和finally块中使用。通常在catch和finall块被,异常依然在仓房中莫缓解之状态,并且之后将见面于扔来。如果await在这时刻前使,栈将会晤有所不同,并且抛来大的一言一行将会见转换得难以定义。

  请牢记替代以catch块中采用block的道是以该背后,通过返回一个布尔值来记录操作是否摒弃来一个怪。示例如下:

try
{
   page = await webClient.DownloadStringTaskAsync("http://oreilly.com");
}
catch (WebException)
{
   page = await webClient.DownloadStringTaskAsync("http://oreillymirror.com");
}

   你可坐如下方式代替:

bool failed = false;
try
{
   page = await webClient.DownloadStringTaskAsync("http://oreilly.com");
}
catch (WebException)
{
   failed = true;
}
if (failed)
{
   page = await webClient.DownloadStringTaskAsync("http://oreillymirror.com");
}

  lock块

  lock是相同栽助编程人员防止其他线程和当前线程访问同对象的方。因为异步代码通常会自由开始实施异步的线程,并且会给回调并且有回调在一个不确定的时间量之后,即为保释掉后以及始发的线程不同(译者:即使同样的线程,它呢是自由掉下的了),所以于await上加锁没有其它意义。

  
以有景象下,保护你的目标非给冒出访问是很要紧之,但是以未曾外线程在await期间来聘你的靶子,使用锁是没必要之。在这些情形下,你的操作是生头冗余的,显式地锁定了少于次于,如下:

lock (sync)
{
    // Prepare for async operation
}
    int myNum = await AlexsMethodAsync();
lock (sync)
{
    // Use result of async operation
}

  另外,你得应用一个类库来展开拍卖并发控制,比如NAct,我们以见面在第十章介绍

  如果你不够幸运,你也许要以推行异步操作时保持某种锁。这时,你就是得苦思冥想并小心谨慎,因为一般锁住异步调用资源,而非造成争用和死锁是很困难的。也许遇到这种情形想另外方法或重构你的程序是最好好的挑选。

  Linq Query表达式

  C#发出雷同栽语法帮助我们进一步容易之失通过写querys来上过滤,排序,分组等目的。这些query可以吃实施于.NET平台及或转移成数据库操作还是其他数据源操作。

IEnumerable<int> transformed = from x in alexsInts
where x != 9
select x + 2;

  C#举凡当大多数职位是勿允以Query表达式中利用await关键字的。是坐这些岗位会给编译成lambda表达式,正因为这样,该lambda表达式需要标记为async关键字。只是这样含有蓄的lambda表达式不设有,即使要的确这么做吧会于人口confuse。

  我们还是产生法子,你可形容当量的表达式,通过下Linq内部带来的拓展方法。然后lambda表达式变得亮了可是读,继而你呢不怕足以记他们吧async,从而以await了。(译者:请对照上下代码来读书)

IEnumerable<Task<int>> tasks = alexsInts
.Where(x => x != 9)
.Select(async x => await DoSomthingAsync(x) + await DoSomthingElseAsync(x));
IEnumerable<int> transformed = await Task.WhenAll(tasks);

  为了搜集结果,我利用了Task.WhenAll,这是也Task集合所工作之家伙,我以见面在第七章介绍细节。

  不安全(unsafe)的代码

  代码被记为unsafe的未克包含await,非安全之代码应该形成好稀少而该维持方法独用和非欲异步。反正在编译器对await做转换的时刻吧会见跳出unsafe代码。(译者:我看其实这里并非太在意啦,反正没写过unsafe关键字的代码)

抓获异常

  异步方法的怪捕获被微软规划的尽心与咱们例行同步代码一样的。然而异步的复杂性意味着她们之间还见面有些细微差别。在这边我将介绍异步如何简单的处理好,我为拿当第九章详见讲解注意事项。

  当耗时操作结束时,Task类型会生出一个定义来表明成功还是败诉。最简便易行的便是由IsFaulted属性来为他暴露,在实行进程被生出特别它的价就是是true。await关键字用会晤发觉到当时一点又会废弃来Task中蕴含的生。

           
如果您熟悉.NET异常机制,用或会担心很的库跟踪在委来很时如何科学的保存。这在过去或许是免容许的。然而在.NET4.5面临,这个限制受涂改掉了,通过一个叫做ExceptionDispatchInfo的好像,即一个合作十分的捕捉,抛来同不利的仓库跟踪的类似。

  异步方法吗会窥见到不可开交。在尽异步方法中发生其他特别,都非会见让捕捉,他们见面趁Task的回来而回到给调用者。当起这种场面常常,如果调用者在await这个Task,那么稀将会晤以此抛出。(译者:之前发生道到老在异步中见面让传送)。在这种艺术下,异常通过调用者传播,会形成一个虚拟的库跟踪,完全就是比如她产生在并代码中相同。

           
我把它乘坐虚拟堆栈跟踪,因为堆栈是一个单线程拥有的这样的概念,并且于异步代码中,当前线程实际的库房和发大那个线程的仓库可能是特别例外之。异常捕捉的凡用户意图中之堆栈跟踪,而休是C#怎么选择执行这些方式的细节。

直到被需要前面异步方法都是共的

  我事先说的,使用await只能消费(调用)异步方法。直到await结果产生,这个调用方法的语句以调用他们之线程中运作,就如一头方法同样。这老富有现实意义,尤其是以一个联机的历程一气呵成有着异步方法链时。(译者:当使用await的时光,的确就是随同的逐条来施行)

  还记得之前异步方法暂停在率先糟碰到await时。即使如此,它有时为无欲暂停,因为有时await的Task已经完成了。一个Task已经于得的情如下:

  
·他是为创造好的,通过Task.FromResult工具方法。我们拿会晤以第七段详细探索。

   ·由没遇到async的async方法返回。

   ·它运行一个真正的异步操作,但是现在一度形成了(很可能是出于当下线程在撞await之前已举行了一点事情)。

  
·它为一个撞await的asunc方法返回,但是所await的之前面就早已形成了。

  由于最后一个可能性,一些妙不可言之事情发在您await一个早就完结的Task,很可能是当一个深的异步方法链中。整个链条很像了同步的。这是盖以异步方法链中,第一单await被调用的方总是异步链最特别的一个。其他的道到达晚,最要命的计才出机会回到。(
The others are only reached after the deepest method has had a chance to
return
synchronously.译者:按照语法来讲话自己之及时词话貌似翻译的不科学,但是本人个人认为其实情形就是自我说之之样子。在撞第一只await后,后面异步方法链中的await依次执行,逐个返回,最后才回去结果到无限要命的法,也不怕是首先独章程,有哲人来提出此的见吗?)

  
你恐怕会猜疑为什么以第一栽要第二种植情形下还使async。如果这些主意承诺一直同的归,你是对的,并且这样描绘同步的代码效率超过异步并且没有await的历程。然后,这才是艺术并返回的气象。比如,一个法缓存其结果及外存中,并当缓存可用的时段,结果好被同台地回去,但是当她需异步的纱要。当你懂出一个好时被你使用异步方法,在某种程度上您或许还想使术返回Task或者Task<T>。(异步:既然方法链中发出一个要是异步,那么即使见面潜移默化整都以异步)。

形容以最终

  关于异步我还有好多困惑,也是趁文章逐步理解,我为可望会及早一些哟。