假若你觉得那件事情没意义翻译的又差,在每2回应该单独思想的时候

  大家还是有措施,你能够写当量的表明式,通过使用Linq内部带的开始展览方法。然后lambda表明式变得明了可读,继而你也就能够标记他们为async,从而选择await了。(译者:请对照上下代码来阅读)

那是父级上下文,全数其余上下文都以它的一有些。那是.NET的系统功效,如Task使用其捕捉和扩散上下文,不过它本身不分包怎样作为。

      
进一步运用类似上一段的类比:2个阻塞型方法更像你暂停一台电脑(S3
sleep),它纵然选拔较少的财富,但从根本上来讲它直接在运转着。

在特出的情况下,我们愿意编制程序者察觉不到那里的蛰伏。即便实际上休眠和提醒二个格局的先前时代实施是很复杂的,C#也将会保证您的代码被唤起,就好像什么都没发出同样。(译者:不得不赞扬微软对语法糖的包裹和拍卖)。

休眠和提示叁个措施

转发和爬虫请阐明原来的小说链接http://www.cnblogs.com/tdws/p/5659003.html,博客园
蜗牛 2016年6月27日。

  作者把那些进度作为多少个蛰伏一台电脑的小框框景况来看(S4
sleep)。这些艺术当前的动静会被储存起来(译者:状态存款和储蓄起来,正如大家第2章厨房越发例子,大厨会把已位居烤箱中的食品的烹调状态以标签的方式贴在上边),并且那些办法完全退出(厨子走了,恐怕去做其余工作了)。当一台微型总计机休眠,计算机的动态数据和平运动行数据被保存到磁盘,并且变得完全关闭。下边那段话和处理器休眠差不多二个道理,3个正值await的艺术除了用一点内部存款和储蓄器,不使用其余能源,那么能够当作那个正推行的线程已经被保释。

异步方法的分外捕获被微软安插的尽心和大家如常同步代码一样的。可是异步的扑朔迷离意味着他们中间还会稍稍细微差异。在此间小编将介绍异步如何简单的拍卖分外,小编也将在第九章详见讲解注意事项。

   ·它运转1个的确的异步操作,不过以往已经完毕了(非常的大概是出于当下线程在遇见await从前早已做了一些事情)。

由于最终二个或然,一些有趣的工作发生在你await叁个已经完结的Task,很或然是在二个纵深的异步方法链中。整个链很像完全同步的。那是因为在异步方法链中,第叁个await被调用的艺术总是异步链最深的贰个。其余的不二法门到达后,最深的方式才有空子回到。(
The others are only reached after the deepest method has had a chance to
return
synchronously.译者:依据语法来讲本身的那句话貌似翻译的不得法,可是本身个人觉得实在景况便是本身说的这一个样子。在境遇第③个await后,前面异步方法链中的await依次执行,每种再次回到,最后才再次来到结果到最深的法门,约等于第多个办法,有哲人来提议那里的看法吗?)

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

lock是一种扶助理编辑程人士幸免别的线程和当下线程访问同一对象的主意。因为异步代码日常会自由早先履行异步的线程,并且会被回调并且爆发回调在贰个不明确的时间量之后,即被释放掉后和初阶的线程分歧(译者:就算同一的线程,它也是刑释掉之后的了),所以在await上加锁没有其余意义。

  不安全(unsafe)的代码

在有关什么行使await关键字没有何尤其的界定,例如,他们能够被用在三个长表明式上,只怕包蕴不止二个await:

  C#有一种语法支持大家越来越简单的去通过书写querys来完成过滤,排序,分组等指标。这么些query能够被实施在.NET平台上大概转换来数据库操作仍旧别的数据源操作。

·在本范围内享有你定义的变量

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

更是利用类似上一段的类比:3个阻塞型方法更像您暂停一台计算机,它固然应用较少的能源,但从根本上来讲它间接在运作着。

第①5章 异步代码的天性

C#将会在你方法复苏(resume,这里就是独自的“恢复生机”)的时候恢复(restore,作者认为那里指从内部存款和储蓄器中还原)这么些类其他上下文。苏醒上下文将产生局地开销,比如,贰个先后在采纳模拟(以前的上行下效身份之类的)的时候并大方选择async将会变得更慢一些。我提出必变.NET创建上下文的效果,除非你觉得那确实有须要。

  SecurityContext

本人事先说的,使用await只可以消费异步方法。直到await结果爆发,这么些调用方法的言语在调用他们的线程中运作,就如一块方法一致。那十一分具有现实意义,尤其是以多少个手拉手的进度一鼓作气具有异步方法链时。(译者:当使用await的时候,的确正是比照联合的逐条来施行)

   当你的程序执行遇到await关键字时,大家想要发生两件事:

await能够用在别的标志async的章程和和格局内多数的地点,但是有一部分地点你不能用await。小编将分解为什么在一些境况下差别意await。

await能用在哪个地方?

那都以确实;它们就好像相同枚硬币的两面。在本章,大家将会集中在第1点上来斟酌异步。在第十四章大家将会从另一个角度来斟酌,即更扑朔迷离的,不过提供了有个别细节使debug和天性考虑越来越明显。

  
·当你await的Task达成时,你的点子应该在此之前边的义务延续,就好像它没在早些时候被重回。

小编们有三种角度来对待C#5.0的async功用特色,尤其是await关键字上产生了怎么样:

图片 1

Linq Query表达式

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

为了形成那些行为,你的法门必须在蒙受await时刹车,然后在前日的有个别时刻恢复生机执行。

  即使在try块中央银行使await是完全同意的,可是她分裂目的在于catch和finally块中采纳。常常在catch和finall块中,分外照旧在仓房中未缓解的景观,并且之后将会被抛出。假设await在那些时刻前使用,栈将会迥然不相同,并且抛出十二分的作为将会变得难以定义。

还记得以前异步方法暂停在首先次遇到await时。即便如此,它有时也不必要暂停,因为有时候await的Task已经成功了。一个Task已经被成功的场馆如下:

第03章 手动编写异步代码

lock块

  lock块

C#是在大部分岗位是不容许在Query表明式中选拔await关键字的。是因为这几个职责会被编写翻译成lambda表明式,正因为那样,该lambda表明式须要标记为async关键字。只是那样含蓄的lambda表明式不存在,就算假如的确如此做也会令人confuse。

  lock是一种帮忙编制程序职员防止别的线程和当前线程访问同一对象的方法。因为异步代码经常会放出起先推行异步的线程,并且会被回调并且发生回调在一个不分明的时间量之后,即被假释掉后和起来的线程分歧(译者:即使同样的线程,它也是自由掉之后的了),所以在await上加锁没有其他意义。

代码被标记为unsafe的不能够包蕴await,非安全的代码应该形成分外博闻强识并且应该保障方法独用和不须求异步。反正在编写翻译器对await做转换的时候也会跳出unsafe代码。(译者:作者以为实在那里并非太在意啦,反正没写过unsafe关键字的代码)

  C#将会在你方法苏醒(resume,那里正是只是的“恢复生机”)的时候苏醒(restore,小编觉得那里指从内部存款和储蓄器中平复)那几个品种的上下文。恢复生机上下文将发出部分支付,比如,一个程序在使用模拟(在此以前的效仿身份之类的)的时候并大方用到async将会变得更慢一些。作者提议必变.NET成立上下文的作用,除非你以为那诚然有须要。

第05章 Await毕竟做了什么样

  ·你方法的参数

您或然会思疑为啥在首先种或第三种情形下还利用async。若是这么些主意承诺一贯联手的回到,你是没错的,并且那样写同步的代码功能抢先异步并且没有await的进度。然后,那只是方法同步重临的景况。比如,三个格局缓存其结果到内部存款和储蓄器中,并在缓存可用的时候,结果能够被一并地赶回,不过当它需求异步的网络请求。当你了解有二个好机遇让您使用异步方法,在某种程度上你恐怕还想要方法再次回到Task大概Task<T>。(异步:既然方法链中有2个要异步,那么就会影响总体都应用异步)。

           
若是你熟练.NET很是机制,用恐怕会担心相当的仓库跟踪在抛出10分时怎么正确的保存。那在过去说不定是不只怕的。可是在.NET4.5中,这么些限制被修改掉了,通过一个叫做ExceptionDispatchInfo的类,即2个搭档十一分的捕捉,抛出和科学的堆栈跟踪的类。

本身把它乘坐虚拟堆栈跟踪,因为堆栈是三个单线程拥有的如此的定义,并且在异步代码中,当前线程实际的仓库和发生非凡这一个线程的库房可能是万分例外的。万分捕捉的是用户意图中的堆栈跟踪,而不是C#怎么挑选执行那些格局的底细。

  首先,你方法中本地的变量的值会被记住,包含以下值:

第壹3章 WinTiguanT应用中的异步编制程序

  为了形成那些行为,你的主意必须在遭受await时刹车,然后在以后的某些时刻复苏执行。

第03章 手动编写异步代码

  关于异步作者还有好多迷惑,也是随着小说稳步驾驭,作者也意在能快一些啊。

至于异步作者还有许多嫌疑,也是随着小说稳步领悟,我也期待能快一些哟。

  异步方法也能发现到十分。在履行异步方法之间产生任何尤其,都不会被捕捉,他们会趁着Task的回来而回到给调用者。当产生那种情状时,假若调用者在await那一个Task,那么十分将会在此间抛出。(译者:以前有讲到分外在异步中会被传送)。在那种方式下,格外通过调用者传播,会形成三个虚构的仓库跟踪,完全就像是它发生在协同代码中同样。

第②5章 异步代码的性质

第②3章 WinCR-VT应用中的异步编制程序

·假若您的措施非静态,那么蕴涵this变量。这样,你类的分子变量在章程唤醒时都是可用的。

catch和finally块

在部分动静下,爱慕你的对象不被冒出国访问问是很重庆大学的,可是在并未别的线程在await时期来走访你的靶子,使用锁是绝非供给的。在那些意况下,你的操作是有个别冗余的,显式地锁定了三回,如下:

  在优质的情事下,大家期待编制程序者察觉不到那边的休眠。就算实际上休眠和提示三个艺术的先前时代实施是很复杂的,C#也将会确认保证您的代码被唤起,如同什么都没发生同样。(译者:不得不陈赞微软对语法糖的卷入和处理)。

作为3个使await的进度尽量透明的有些,C#捕捉各个上下文在遇见await时,然后在复苏措施使将其恢复生机。

   ·由没遭受async的async方法重临。

catch和finally块

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

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

  ExecutionContext

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

  
·他是被创立完毕的,通过Task.FromResult工具方法。大家将会在第八章详细探索。

·别的变量包罗循环数

  为了去记住剩余部分的表明式的情况在await有个别事物时,增添了额外的原则。比如,当大家运维await
StuffAsync()时,await
myTask的结果要求被记住。.NET中间语言(IL)在栈上存款和储蓄那种子类说明式,因此,那个栈便是大家await关键字供给仓库储存的。

C#有一种语法协理大家进一步便于的去通过书写querys来达到过滤,排序,分组等指标。这个query能够被实践在.NET平台上还是转换到数据库操作依旧其余数据源操作。

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

最器重的是,当程序执行到第一个await关键字时,方法便再次来到了(译者:关于艺术在碰到await时重回,提议读者从第①章拆分的多少个格局来领会)。假设它不是2个async
void方法,贰个Task在那些随时被再次回到,因而调用者能够等待大家以某种格局成就。C#也必须存款和储蓄一种操作重临的Task的方法,那样当您的方法成功,那个Task也变得completed,并且执行者也得以回来到点子的异步链在那之中。确切的建制将会在第九四章中介绍。

  固然你认为那件事儿没意义翻译的又差,尽情的踩吧。假使你觉得值得鼓励,谢谢留下您的赞,愿爱技术的园友们在随后每二次应该能够突破的时候,不选取知难而退。在每三次应该单独思考的时候,不选用与世浮沉,应该奋力的时候,不选用尽量,不辜负每一秒存在的含义。

上下文

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

await能用在何处?

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

图片 2

  await可以用在其余标记async的点子和和方式内当先二分之一的地点,然而有一对地点你不能用await。作者将解释为啥在有个别景况下不容许await。

自身把那些进度作为二个休眠一台电脑的小框框意况来看。那几个措施当前的场馆会被积存起来(译者:状态存款和储蓄起来,正如大家第叁章厨房越发例子,厨子会把已位居烤箱中的食品的烹饪状态以标签的花样贴在下面),并且这一个法子完全脱离(厨神走了,只怕去做别的业务了)。当一台微型计算机休眠,总结机的动态数据和平运动转数据被保存到磁盘,并且变得精光关闭。上面那段话和电脑休眠差不多三个道理,2个正在await的点子除了用一点内部存储器,不选取任何财富,那么能够当做那几个正推行的线程已经被放走。

  
在一些意况下,爱抚你的靶子不被出现访问是很重点的,但是在一向不任何线程在await时期来做客你的目的,使用锁是不曾要求的。在那几个景况下,你的操作是有个别冗余的,显式地锁定了一次,如下:

第01章 异步编制程序介绍

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

CallContext(那一个东西耳熟能详吧,相信用过EF的都领会)

  作为1个使await的经过尽量透明的一些,C#捕捉各个上下文在蒙受await时,然后在回复措施使将其死灰复燃。

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

  由于最终三个恐怕,一些诙谐的业务爆发在你await2个已经完成的Task,很只怕是在叁个纵深的异步方法链中。整个链很像完全同步的。那是因为在异步方法链中,第3个await被调用的点子总是异步链最深的1个。别的的点子到达后,最深的主意才有空子回到。(
The others are only reached after the deepest method has had a chance to
return
synchronously.译者:依照语法来讲自身的那句话貌似翻译的不得法,但是本身个人觉得其实景况就是本身说的那几个样子。在际遇第多少个await后,前边异步方法链中的await依次执行,每一种再次来到,最终才再次来到结果到最深的情势,也便是第五个方法,有哲人来提议那里的见解吗?)

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

方法的状态

纵然在try块中运用await是完全同意的,但是他分化意在catch和finally块中央银行使。日常在catch和finall块中,很是依旧在仓库中未缓解的图景,并且之后将会被抛出。即便await在那一个时刻前使用,栈将会有所分裂,并且抛出极度的表现将会变得难以定义。

写在结尾

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

  ·作为1个在编译时的变换,那是八个C#语法糖,为了简略在此以前复杂的异步代码

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

  假诺你不够幸运,你只怕必要在推行异步操作时保持某种锁。那时,你就需求左思右想并小心翼翼,因为一般而言锁住异步调用能源,而不造成争用和死锁是十一分难堪的。只怕遇到这种场馆想任何方法照旧重构你的次序是最棒的挑选。

请记住替代在catch块中利用block的措施是在其背后,通过重回三个布尔值来记录操作是还是不是抛出贰个要命。示例如下:

  那允许编制程序者存款和储蓄他们在逻辑线程的生命周期中央直机关接可用的数据。尽管考虑到在重重情景下有倒霉的变现,它还是能够幸免程序中方法的参数传来传去。(译者:因为您存到callcontext里,随时都得以收获呀,不用通过传参数字传送来传去了)。LogicalCallContextis是1个皮之不存毛将焉附的能够跨用应用程序域的。

你能够以如下方式取代:

  ·在本范围内有着你定义的变量

我们仍旧有方法,你可以写当量的表达式,通过利用Linq内部带的进行方法。然后lambda表达式变得明了可读,继而你也就能够标记他们为async,从而采纳await了。(译者:请对照上下代码来阅读)

  笔者前边说的,使用await只可以消费(调用)异步方法。直到await结果发生,那一个调用方法的语句在调用他们的线程中运转,就像二只方法一致。那非常富有现实意义,特别是以1个合伙的历程实现全部异步方法链时。(译者:当使用await的时候,的确就是比照联合的顺序来进行)

在学异步,有位园友推荐了《async in
C#5.0》,没找到汉语版,恰巧也想进步下英文,用自笔者愚钝的英文翻译一些要害的有的,纯属娱乐,简单分享,保持学习,谨记谦虚。

上下文

·作为三个语言的功力特色,他是2个供您读书的已经定义好的一言一行

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

其它,你可以利用多少个类库来开始展览处理并发控制,比如NAct,大家将会在第十章介绍

  最注重的是,当程序执行到第③个await关键字时,方法便回来了(译者:关于艺术在蒙受await时重回,提出读者从第②章拆分的五个格局来驾驭)。假使它不是叁个async
void方法,多少个Task在那几个随时被重回,因而调用者能够等待大家以某种方式形成。C#也务必存款和储蓄一种操作再次来到的Task的措施,这样当您的措施成功,这么些Task也变得completed,并且执行者也足以回来到点子的异步链其中。确切的编写制定将会在第⑧四章中介绍。

·当你await的Task完毕时,你的主意应该从前面的职责三番五次,就好像它没在早些时候被重临。

破获卓殊

·它被多个遇见await的asunc方法重临,不过所await的那么些前边就早已做到了。

  在学异步,有位园友推荐了《async in
C#5.0》,没找到汉语版,恰巧也想增强下英文,用本身愚蠢的英文翻译一些至关心注重要的一部分,纯属娱乐,简单分享,保持学习,谨记谦虚。

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

  
·它被3个遇见await的asunc方法重临,不过所await的那几个后边就早已做到了。

C#也会记住在艺术的如何职位会进行到await。那能够运用数字存款和储蓄起来,用来代表await关键字在时下艺术的岗位。

  异步方法的百般捕获被微软布署的玩命和大家例行同步代码一样的。可是异步的复杂意味着他们中间还会略微细微差距。在此间笔者将介绍异步怎样容易的拍卖卓殊,小编也将在第九章详尽讲解注意事项。

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

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

别的类型的上下文也会被从脚下调用的线程捕捉。他们的控制是因而1个均等名称的类来促成的,所以自身将列出一些重点的内外文类型:

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

值得注意的是线程本地存款和储蓄,它和CallContext的靶子一般,但它在异步的景况下是不坐班的,因为在贰个耗费时间操作中,线程被放走掉了,并且只怕被用来拍卖任何事情了。你的形式恐怕被唤起并进行在一个见仁见智的线程上。

  Linq Query表达式

为了准确的弄通晓在你利用await时C#到底为我们做了略微工作,作者想列出全部关于艺术状态的有着大家铭记和掌握的底细。

  ·如果你的方法非静态,那么蕴含this变量。那样,你类的分子变量在点子唤醒时都以可用的。

写在近期

  其余品类的上下文也会被从方今调用的线程捕捉。他们的决定是通过1个等同名称的类来贯彻的,所以我将列出一些至关心珍惜要的光景文类型:

首先,你方法中本地的变量的值会被铭记,包罗以下值:

           
作者把它乘坐虚拟堆栈跟踪,因为堆栈是三个单线程拥有的这么的定义,并且在异步代码中,当前线程实际的仓库和产生格外那一个线程的仓库大概是卓殊差异的。很是捕捉的是用户意图中的堆栈跟踪,而不是C#怎么抉择执行这么些方法的细节。

在享有事务中最重视的依旧壹只上下文(synchronization
context),即能够被用于苏醒措施在一个出奇类型的线程上。那对于UI
app尤其重点,正是那种只可以在科学的线程上操作UI的(正是winform
wpf之类的)。同步上下文是三个扑朔迷离的话题,第八章将会详细解释。

  代码被标记为unsafe的无法包括await,非安全的代码应该做到那多少个少见并且应该保持方法独用和不须要异步。反正在编写翻译器对await做转换的时候也会跳出unsafe代码。(译者:笔者觉着实在那里并非太在意啦,反正没写过unsafe关键字的代码)

他们都被存在.NET
垃圾回收堆的二个指标上。因而当您选择await时,多个消耗一些财富的对象将会被分配,不过在大部情况下不用担心品质难题。

   你能够以如下形式取代:

当耗时操作截至时,Task类型会有二个概念来申明成功或许退步。最简易的就是由IsFaulted属性来向外揭露,在实践进度中发出十分它的值正是true。await关键字将会发现到那或多或少并且会抛出Task中蕴涵的格外。

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

方法的状态

第⑨章 并行使用异步编程

当您的程序执行蒙受await关键字时,大家想要发生两件事:

  还记得在此之前异步方法暂停在首先次境遇await时。即便那样,它有时也不需求暂停,因为有时await的Task已经成功了。一个Task已经被成功的图景如下:

·它运维2个确实的异步操作,不过以后早就实现了(十分的大概是由于近日线程在遇见await在此之前已经做了好几事情)。

  这都是确实;它们就好像相同枚硬币的两面。在本章,大家将会集中在第①点上来研商异步。在第十四章大家将会从另1个角度来商讨,即更扑朔迷离的,可是提供了有个别细节使debug和性情考虑越来越鲜明。

为了去记住剩余部分的表达式的情景在await有个别事物时,扩大了附加的尺度。比如,当我们运营await
StuffAsync()时,await
myTask的结果要求被记住。.NET中间语言在栈上存款和储蓄那种子类表明式,由此,那一个栈正是大家await关键字需求仓库储存的。

第05章 Await毕竟做了怎么

假若你熟知.NET至极机制,用可能会担心格外的仓库跟踪在抛出非凡时怎么样正确的保存。那在过去恐怕是不恐怕的。然则在.NET4.5中,这些界定被修改掉了,通过2个叫做ExceptionDispatchInfo的类,即3个搭档十一分的捕捉,抛出和不易的库房跟踪的类。

  请牢记替代在catch块中动用block的法门是在其背后,通过再次回到贰个布尔值来记录操作是或不是抛出贰个那贰个。示例如下:

为了搜集结果,小编动用了Task.WhenAll,那是为Task集合所工作的工具,笔者将会在第七章介绍细节。

  在有关怎样使用await关键字没有怎么越发的限量,例如,他们得以被用在贰个长表达式上,恐怕含有不止二个await:

以至被供给前异步方法都以同台的

  ·其余变量包涵循环数

休眠和提醒一个主意

第01章 异步编制程序介绍

抓获很是

以至于被亟需前异步方法都以一块的

第04章 编写Async方法

  那是父级上下文,全体别的上下文都以它的一片段。那是.NET的系统机能,如Task使用其捕捉和传播上下文,可是它本身不含有如何表现。

·你方法的参数

  
·为了使您的代码异步,当前实施你代码的线程应该被放出。这代表,在经常,同步的角度来看,你的法子应该回到。

·他是被创建完毕的,通过Task.FromResult工具方法。大家将会在第⑧章详细探索。

  ·作为三个言语的法力特色,他是二个供你学习的早已定义好的作为

第壹4章 编写翻译器在底层为你的异步做了哪些

  当耗费时间操作截至时,Task类型会有一个概念来评释成功照旧失利。最简易的正是由IsFaulted属性来向外暴光,在实践进度中爆发尤其它的值正是true。await关键字将会发觉到那一点还要会抛出Task中蕴藏的充裕。

写在最后

  
你只怕会存疑为何在第1种或第三种情况下还使用async。借使这个艺术承诺一直联手的回来,你是科学的,并且那样写同步的代码功效超过异步并且没有await的长河。然后,那只是方法同步重返的情景。比如,二个情势缓存其结果到内存中,并在缓存可用的时候,结果能够被联合地回去,可是当它供给异步的互连网请求。当你精晓有三个好机会让你选取异步方法,在某种程度上您只怕还想要方法再次回到Task也许Task<T>。(异步:既然方法链中有3个要异步,那么就会潜移默化总体都使用异步)。

ExecutionContext

  大家有二种角度来对待C#5.0的async效能特色,尤其是await关键字上爆发了何等:

await毕竟做了如何?

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

那允许编制程序者存储他们在逻辑线程的生命周期中直接可用的数额。就算考虑到在许多意况下有糟糕的变现,它如故可防止止程序中艺术的参数字传送来传去。(译者:因为您存到callcontext里,随时都能够赢得呀,不用经过传参数字传送来传去了)。LogicalCallContextis是三个有关的能够跨用应用程序域的。

await究竟做了怎样?

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

  在享有业务中最根本的依然二头上下文(synchronization
context),即能够被用来苏醒措施在贰个特殊类型的线程上。那对于UI
app越发首要,便是那种只幸好科学的线程上操作UI的(便是winform
wpf之类的)。同步上下文是3个复杂的话题,第八章将会详细表达。

SecurityContext

  他们都被存在.NET
垃圾回收堆(GC堆)的2个对象上。因而当你利用await时,一个消耗一些财富的靶子将会被分配,不过在多数景况下不用担心品质难题。

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

  那是我们发现并找到平时被界定在脚下线程的定西新闻的地点。即使您的代码要求周转在特定的用户,你可能会,模拟可能扮演那一个用户,大概ASP.NET将会帮您达成扮演。在这种情况下,模拟音信会设有SecurityContext。

目录

      
值得注意的是线程本地存储(TLS),它和CallContext的指标一般,但它在异步的情状下是不工作的,因为在三个耗费时间操作中,线程被放出掉了,并且恐怕被用来拍卖其余业务了。你的形式恐怕被晋升并实施在一个不等的线程上。

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

  CallContext(这么些事物耳熟能详吧,相信用过EF的都知情)

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

设若你不够幸运,你只怕需求在履行异步操作时保持某种锁。这时,你就供给大费周折并敬小慎微,因为日常锁住异步调用财富,而不造成争用和死锁是老大拮据的。或者境遇那种意况想此外措施照旧重构你的次第是最棒的选拔。

第叁4章 编写翻译器在底层为您的异步做了怎么

那是大家发现并找到常常被限定在当前线程的平安消息的地点。假如您的代码需求周转在特定的用户,你恐怕会,模拟或许扮演那些用户,恐怕ASP.NET将会帮你完毕扮演。在那种气象下,模拟音讯会设有SecurityContext。

  为了收集结果,小编利用了Task.WhenAll,那是为Task集合所工作的工具,作者将会在第七章介绍细节。

不安全的代码

  C#也会记住在措施的什么岗位会实施到await。那足以接纳数字存款和储蓄起来,用来表示await关键字在脚下艺术的地方。

·为了使你的代码异步,当前进行你代码的线程应该被放出。那意味着,在平时,同步的角度来看,你的点子应该回到。

写在日前

·由没遇上async的async方法再次回到。

  别的,你能够应用多个类库来展开始拍戏卖并发控制,比如NAct,我们将会在第十章介绍

第09章 异步编制程序中的万分

  为了准确的弄掌握在你使用await时C#到底为我们做了有个别工作,作者想列出全体关于艺术状态的富有大家铭记和精通的底细。

异步方法也能窥见到万分。在进行异步方法之间发生任何尤其,都不会被捕捉,他们会趁着Task的回到而回到给调用者。当产生那种气象时,假设调用者在await那么些Task,那么分外将会在那里抛出。(译者:以前有讲到至极在异步中会被传送)。在这种办法下,极度通过调用者传播,会形成2个虚构的仓库跟踪,完全就如它爆发在一起代码中相同。

第04章 编写Async方法

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

目录

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

  C#是在超越四分之4人置是分歧意在Query表明式中央银行使await关键字的。是因为那一个地点会被编写翻译成lambda表明式,正因为这么,该lambda表明式需求标记为async关键字。只是那样含蓄的lambda表达式不设有,即便如若确实如此做也会令人confuse。

若是您以为那件事情没意义翻译的又差,尽情的踩吧。假若您觉得值得鼓励,多谢留下你的赞,愿爱技术的园友们在之后每二遍应该能够突破的时候,不采用知难而退。在每一遍应该单独思想的时候,不选择与世浮沉,应该大力的时候,不选择尽量,不辜负每一秒存在的含义。

相关文章