异步编程系列第05段 Await究竟开了哟?异步编程系列第05章节 Await究竟做了什么?

描绘在前方

写于头里

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

  在模仿异步,有各类园友推荐了《async in
C#5.0》,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些关键的一部分,纯属娱乐,简单分享,保持学习,谨记谦虚。

  如果你觉得就件事儿没意义翻译的而差,尽情的践踏吧。如果你当值得鼓励,感谢留下您的夸奖,愿爱技术的园友们于随后各一样破当可以突破的时,不选知难而退。在每一样赖当单独思考的下,不选择按照波逐流,应该努力的时段,不选尽量,不辜负每一样秒存在的含义。

  如果您当这件事儿没意义翻译的而不同,尽情的践踏吧。如果您觉得值得鼓励,感谢留下你的赞扬,愿爱技术之园友们于以后各国一样差当重突破之时节,不挑知难而退。在各个一样软当单独思想的早晚,不拣按波逐流,应该尽力的当儿,不选择尽量,不辜负每一样秒存在的意思。

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

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

图片 1

图片 2

目录

目录

第01章节 异步编程介绍

第01回 异步编程介绍

第02章 为什么采取异步编程

第02章 为什么使用异步编程

第03段 手动编写异步代码

第03章节 手动编写异步代码

第04章 编写Async方法

第04章 编写Async方法

第05回 Await究竟开了什么

第05节 Await究竟做了哟

第06章节
以Task为底蕴之异步模式

第06回
以Task为底蕴之异步模式

第07节 异步代码的部分工具

第07章节 异步代码的有些器

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

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

第09章节 异步编程中之生

第09回 异步编程中之深

第10节 并行使用异步编程

第10段 并行使用异步编程

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

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

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

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

第13章节 WinRT应用中之异步编程

第13回 WinRT应用中之异步编程

第14节 编译器在底部为公的异步做了呀

第14章节 编译器在脚为您的异步做了哟

第15章 异步代码的属性

第15节 异步代码的性能

await究竟做了啊?

await究竟开了哟?

  我们有些许种角度来看待C#5.0的async功能特色,尤其是await关键字达产生了哟:

  我们发出点儿栽角度来对待C#5.0之async功能特色,尤其是await关键字达闹了哟:

  ·作为一个语言的效应特色,他是一个供而读书之已定义好的行事

  ·作为一个语言的机能特色,他是一个供你读书之既定义好的一言一行

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

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

  这还是的确;它们就是像相同朵硬币的片面。在本章,我们拿会集中在第一触及及来探讨异步。在程序十四章咱用会见由其它一个角度来探索,即再扑朔迷离的,但是提供了有细节要debug和性考虑越来越清楚。

  这还是真的;它们就如相同枚硬币的点滴直面。在本章,我们用会见集中在率先碰达到来探索异步。在先后十四章咱们以见面自旁一个角度来探讨,即再复杂的,但是提供了部分细节而debug和性能考虑越来越清晰。

休眠和提示一个术

休眠和唤醒一个智

   当您的程序执行遇到await关键字时,我们怀念要生两宗事:

   当您的程序执行遇到await关键字时,我们怀念如果来两件事:

  
·为了使你的代码异步,当前行你代码的线程应该被放飞。这意味着,在平凡,同步的角度来拘禁,你的法子应该回到。

  
·为了使您的代码异步,当前实践你代码的线程应该给放飞。这意味,在平凡,同步的角度来拘禁,你的方应该回到。

  
·当你await的Task完成时,你的计应该从之前的位置连续,就像其从不在早些时候被归。

  
·当你await的Task完成时,你的方法应该由前面的职位连续,就如她从未在早些时候被归。

  为了形成这个作为,你的主意要于碰到await时暂停,然后以明天的有时刻恢复执行。

  为了形成这作为,你的道必须在碰到await时刹车,然后于前之某时刻恢复执行。

  我管此历程作为一个蛰伏一光计算机的有点框框情况来拘禁(S4
sleep)。这个办法当前底状态会给储存起来(译者:状态存储起来,正如我们第二节厨房特别例子,厨师会把已经在烤箱中之食物的烹调状态为标签的样式贴在面),并且是方式了剥离(厨师走了,可能去举行其他作业了)。当一宝电脑休眠,计算机的动态数据和运作数据给保存到磁盘,并且变得完全关闭。下面就段话与处理器休眠大概一个理,一个正在await的点子除了用一些内存,不采取任何资源,那么可以视作是刚刚推行的线程已经于放。

  我将此历程作为一个蛰伏一台计算机的略微范围情况来拘禁(S4
sleep)。这个法子当前底状态会被积存起来(译者:状态存储起来,正如我们第二章节厨房特别例子,厨师会拿已位居烤箱中的食物的烹饪状态为标签的花样贴于上头),并且是方式了剥离(厨师走了,可能错过举行其他事情了)。当一玉电脑休眠,计算机的动态数据和运行数据让保存到磁盘,并且变得净关闭。下面这段话和处理器休眠大概一个道理,一个方await的方法除了用一些内存,不使其它资源,那么可视作是刚刚推行之线程已经被保释。

      
进一步用类似上一样段子的类似比较:一个阻塞型方法更如您暂停一华微机(S3
sleep),它则使比较少的资源,但从根本上来讲它一直以运行着。

      
进一步使类似上同一段落的好像比较:一个阻塞型方法重复像你暂停一尊计算机(S3
sleep),它则使于少之资源,但从根本上来讲它直接当运作在。

  于大好的状下,我们盼望编程者察觉不至这边的休眠。尽管实际上休眠和提醒一个道的中期实施是老大复杂的,C#呢拿会确保您的代码被唤起,就比如什么还尚未出同样。(译者:不得不称微软对语法糖的包裹和拍卖)。

  于帅的景象下,我们愿意编程者察觉不交此地的蛰伏。尽管实际上休眠和唤醒一个道的中实施是殊复杂的,C#否拿会确保您的代码被提拔,就像啊还无起同样。(译者:不得不称微软对语法糖的包裹和处理)。

方法的状态

方法的状态

  为了准确之抓明白在你以await时C#到底为咱召开了有点工作,我怀念列有有有关艺术状态的所有我们铭记和询问的细节。

  为了规范之折腾明白在您下await时C#到底为咱举行了稍稍工作,我怀念列有具有有关艺术状态的持有我们记住和询问的细节。

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

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

  ·你道的参数

  ·你方的参数

  ·在本范围外具备你定义的变量

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

  ·其他变量包括循环数

  ·其他变量包括循环数

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

  ·如果你的艺术非静态,那么连this变量。这样,你仿佛的分子变量在艺术唤醒时犹是可用之。

  他们还让存在.NET
垃圾回收堆(GC堆)的一个对象及。因此当您下await时,一个消耗一些资源的靶子将会见于分配,但是当大多数状态下不用担心性能问题。

  他们都被存在.NET
垃圾回收堆(GC堆)的一个目标及。因此当您采取await时,一个消耗一些资源的对象将会见于分配,但是于大多数状下未用担心性能问题。

  C#啊会见铭记在方式的呦岗位会实行到await。这好动用数字存储起来,用来代表await关键字当目前方的职位。

  C#否会见记住在术的呦岗位会尽及await。这可使用数字存储起来,用来代表await关键字于时艺术的位置。

  于关于什么利用await关键字没呀特别之克,例如,他们可以给用在一个丰富表达式上,可能含有不止一个await:

  在有关怎样下await关键字没啊特别的限,例如,他们可以吃用在一个增长表达式上,可能含不止一个await:

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

  为了去记住剩余部分的表达式的状态在await某些事物常常,增加了额外的标准。比如,当我们运行await
StuffAsync()时,await
myTask的结果待给铭记。.NET中间语言(IL)在栈上存储这种子类表达式,因此
,这个库房就是咱们await关键字用仓储的。

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

  最着重之是,当程序执行到第一单await关键字时,方法就回来了(译者:关于艺术以遇见await时返回,建议读者从第一章节拆分的有数只章程来掌握)。如果它们不是一个async
void方法,一个Task在斯随时让归,因此调用者可以等待我们因为某种方式完成。C#否必须存储一种操作返回的Task的方式,这样当你的方法成功,这个Task也换得completed,并且执行者也堪回来到点子的异步链当中。确切的建制以会当第十四段中介绍。

  最着重的凡,当程序执行到第一只await关键字时,方法就归了(译者:关于艺术以撞await时返回,建议读者从第一回拆分的少只章程来解)。如果它们不是一个async
void方法,一个Task在是随时让归,因此调用者可以等我们因为某种方式成功。C#为要存储一种植操作返回的Task的主意,这样当你的法门好,这个Task也易得completed,并且执行者也可以回去到点子的异步链当中。确切的编制以会当第十四章节中介绍。

上下文

上下文

  作为一个若await的过程尽量透明底一对,C#捕捉各种上下文在碰到await时,然后于平复措施而将那个恢复。

  作为一个使await的过程尽量透明的有的,C#捕捉各种上下文在遇见await时,然后在恢复措施要将那回复。

  于有着工作受到最重大之抑一头上下文(synchronization
context),即可以给用于恢复措施以一个奇类型的线程上。这对于UI
app尤其重点,就是那种只能于是的线程上操作UI的(就是winform
wpf之类的)。同步上下文是一个苛的话题,第八章以见面详细解释。

  在有着工作受到极度重点的要一道上下文(synchronization
context),即好为用来恢复措施在一个异常类别的线程上。这对UI
app尤其要,就是那种只能在科学的线程上操作UI的(就是winform
wpf之类的)。同步上下文是一个苛的话题,第八章将见面详细解释。

  其他品种的上下文也会受从此时此刻调用的线程捕捉。他们的决定是经一个同样名称的好像来落实的,所以自己拿列出一些第一之前后文类型:

  其他项目的上下文也会见给打此时此刻调用的线程捕捉。他们之控制是由此一个平等名称的近乎来实现之,所以自己拿列出一些关键的左右文类型:

  ExecutionContext

  ExecutionContext

  这是父级上下文,所有其他上下文都是其的相同片段。这是.NET的网机能,如Task使用该捕捉和扩散上下文,但是它自己不含有什么行为。

  这是父级上下文,所有其他上下文都是它的等同片。这是.NET的体系功能,如Task使用该捕捉和传颂上下文,但是它们自己不包含什么作为。

  SecurityContext

  SecurityContext

  这是咱发现并找到日常给界定以时下线程的平安信息之地方。如果你的代码需要周转于一定的用户,你或会,模拟或去这个用户,或者ASP.NET将会见协助您兑现扮演。在这种状况下,模拟信息会在SecurityContext。

  这是我们发现并找到日常为限制于时线程的安全信息的地方。如果您的代码用周转在特定的用户,你恐怕会,模拟或去这个用户,或者ASP.NET将见面支援您兑现扮演。在这种场面下,模拟信息会有SecurityContext。

  CallContext(这个东西耳熟能详吧,相信用过EF的且亮)

  CallContext(这个事物耳熟能详吧,相信用了EF的都掌握)

  这允许编程者存储他们以逻辑线程的生命周期中直接可用的数。即使考虑到于许多状下发出坏的表现,它仍可避免程序中方法的参数传来传去。(译者:因为若抱到callcontext里,随时都可以收获呀,不用经过污染参数传来传去矣)。LogicalCallContextis是一个相关的得跨用应用程序域的。

  这允许编程者存储他们于逻辑线程的生命周期中直接可用的数据。即使考虑到以许多景下有坏的变现,它还是可免程序中智的参数传来传去。(译者:因为您抱到callcontext里,随时都足以得呀,不用经过污染参数传来传去了)。LogicalCallContextis是一个相关的可以跨用应用程序域的。

      
值得注意的是线程本地存储(TLS),它和CallContext的目标一般,但她于异步的状况下是无办事的,因为以一个耗时操作着,线程被放出掉了,并且可能给用来拍卖其他作业了。你的法子可能被唤起并实行于一个不一之线程上。

      
值得注意的是线程本地存储(TLS),它和CallContext的目标一般,但她于异步的情事下是不干活的,因为以一个耗时操作着,线程被保释掉了,并且可能为用来拍卖其他作业了。你的不二法门可能被提拔并实施于一个异之线程上。

  C#以见面在您方恢复(resume,这里虽是一味的“恢复”)的上恢复(restore,我觉着这里指从内存中恢复)这些品种的上下文。恢复上下文将时有发生有支,比如,一个先后在以模拟(之前的依样画葫芦身份之类的)的时刻并大方下async将会见变换得重新缓慢有。我建议一定变.NET创建上下文的效力,除非您道当下真的发生必要。

  C#以见面在公方恢复(resume,这里就是是只是的“恢复”)的时刻恢复(restore,我以为这里指从内存中平复)这些类别的上下文。恢复上下文将起有开支,比如,一个顺序在采取模拟(之前的套身份之类的)的下并大方采取async将见面转移得再缓慢有。我提议一定变.NET创建上下文的功效,除非您以为就真的来必要。

await能用当何处?

await能为此在何方?

  await可以为此在旁标记async的道以及及方法外大部分之地方,但是发生一些地方你无能够为此await。我将分解为何当少数情况下未容许await。

  await可以用在其他标记async的主意与及办法外大部分之地方,但是发生局部地方你无能够就此await。我将解释为什么当少数情况下未容许await。

catch和finally块

catch和finally块

  虽然于try块中使await是全同意的,但是他不允许以catch和finally块中应用。通常在catch和finall块被,异常依然在库房中莫缓解的状态,并且之后将会见叫扔来。如果await在这随时前应用,栈将见面迥然不同,并且抛来怪的一言一行拿会转移得难以定义。

  虽然于try块中以await是一点一滴同意的,但是他莫允许在catch和finally块中应用。通常在catch和finall块被,异常依然以库房中莫缓解的状态,并且之后以会见于扔来。如果await在这时刻前用,栈将会晤有所不同,并且抛来深的表现拿见面变得难以定义。

  请记住替代于catch块中应用block的法子是在那个后面,通过返回一个布尔值来记录操作是否摒弃来一个坏。示例如下:

  请记住替代在catch块中动用block的方是于那背后,通过返回一个布尔值来记录操作是否摒弃来一个分外。示例如下:

try
{
   page = await webClient.DownloadStringTaskAsync("http://oreilly.com");
}
catch (WebException)
{
   page = await webClient.DownloadStringTaskAsync("http://oreillymirror.com");
}
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");
}
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块

  lock是相同种助编程人员防止其他线程和眼前线程访问同一对象的点子。因为异步代码通常会自由开始执行异步的线程,并且会给回调并且有回调在一个请勿确定的时间量之后,即受放飞掉后与开之线程不同(译者:即使同一之线程,它也是刑满释放掉后的了),所以于await上加锁没有其余意义。

  lock是相同种植助编程人员防止其他线程和眼前线程访问同一对象的办法。因为异步代码通常会放开始执行异步的线程,并且会吃回调并且产生回调在一个勿确定的时间量之后,即给放走掉后同起来的线程不同(译者:即使同样之线程,它吧是放掉后的了),所以在await上加锁没有另外意义。

  
在片情形下,保护而的靶子不受起访问是深重要之,但是以没有另外线程在await期间来做客你的靶子,使用锁是尚未必要的。在这些情况下,你的操作是产生来冗余的,显式地锁定了简单蹩脚,如下:

  
以一些情况下,保护你的对象非叫冒出访问是异常要紧的,但是当并未其余线程在await期间来走访你的对象,使用锁是从来不必要的。在这些状况下,你的操作是生几冗余的,显式地锁定了区区糟,如下:

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

  另外,你可以使一个类库来展开拍卖并发控制,比如NAct,我们将会晤以第十章介绍

  另外,你可以使用一个类库来开展处理并发控制,比如NAct,我们拿会当第十章介绍

  如果您不够幸运,你或用在履行异步操作时保持某种锁。这时,你尽管待苦思冥想并小心谨慎,因为一般锁住异步调用资源,而非招争用和死锁是杀紧的。也许遇到这种景象想其他方法或重构你的次序是极其好之挑三拣四。

  如果您不够幸运,你可能要在履异步操作时保持某种锁。这时,你虽需要苦思冥想并小心谨慎,因为普通锁住异步调用资源,而无造成争用和死锁是不行艰苦的。也许遇到这种状态想任何方式要重构你的次是最好之选项。

  Linq Query表达式

  Linq Query表达式

  C#发生相同种植语法帮助我们尤其爱的错过通过写querys来达成过滤,排序,分组等目的。这些query可以为执行于.NET平台上要转移成数据库操作还是其他数据源操作。

  C#出同等种语法帮助我们更为便于之失通过书写querys来达到过滤,排序,分组等目的。这些query可以为实践于.NET平台及还是更换成数据库操作还是其他数据源操作。

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

  C#大凡当大多数岗位是无允以Query表达式中采取await关键字的。是因这些职务会叫编译成lambda表达式,正为这么,该lambda表达式需要标记为async关键字。只是这样含有蓄的lambda表达式不设有,即使要确实如此做呢会于丁confuse。

  C#大凡在大部分职务是休容许以Query表达式中使用await关键字的。是因这些岗位会为编译成lambda表达式,正为如此,该lambda表达式需要标记为async关键字。只是这样含有蓄的lambda表达式不设有,即使要真的如此做也会被人口confuse。

  我们尚是发生点子,你可以写当量的表达式,通过运用Linq内部带来的拓方法。然后lambda表达式变得亮了可是读,继而你呢就好记他们吧async,从而采取await了。(译者:请对照上下代码来阅读)

  我们还是产生道,你得写当量的表达式,通过采用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);
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集合所工作的工具,我将会晤以第七章介绍细节。

  为了搜集结果,我利用了Task.WhenAll,这是啊Task集合所工作之家伙,我将会晤以第七章介绍细节。

  不安全(unsafe)的代码

  不安全(unsafe)的代码

  代码被记为unsafe的非可知包含await,非安全的代码应该做到死难得而该维持方法独用和莫欲异步。反正在编译器对await做转换的时刻吧会见跳出unsafe代码。(译者:我认为实在这里并非太在意啦,反正没写过unsafe关键字之代码)

  代码被标记为unsafe的莫能够包含await,非安全之代码应该完成非常少见而该保障方法独用和未需异步。反正在编译器对await做转换的时刻啊会跳出unsafe代码。(译者:我道其实这里并非太在意啦,反正没写了unsafe关键字之代码)

破获异常

破获异常

  异步方法的不得了捕获被微软计划的尽量与我们例行同步代码一样的。然而异步的纷繁意味着他们之间还见面小细微差别。在此间我用介绍异步如何简单的拍卖非常,我啊将以第九章详细讲解注意事项。

  异步方法的酷捕获被微软计划的玩命与我们如常同步代码一样的。然而异步的复杂意味着他们中还见面稍细微差别。在这边我以介绍异步如何简单的拍卖好,我为用于第九章详见讲解注意事项。

  当耗时操作了时,Task类型会发一个概念来表明成功或失败。最简便的尽管是出于IsFaulted属性来向他暴露,在履进程中生异常它的值就是是true。await关键字用会见发觉到马上或多或少同时会弃来Task中富含的可怜。

  当耗时操作了时,Task类型会时有发生一个概念来表明成功或失败。最简易的哪怕是出于IsFaulted属性来为外暴露,在履行过程被有特别它的价就是true。await关键字用见面意识到就或多或少又会扔来Task中包含的酷。

           
如果你熟悉.NET异常机制,用或会担心很的仓库跟踪在委来深时如何对的保留。这在过去恐是未可能的。然而在.NET4.5遭到,这个界定让修改掉了,通过一个叫做ExceptionDispatchInfo的类,即一个搭档十分的捕捉,抛来和对的仓库跟踪的近乎。

           
如果你熟悉.NET异常机制,用或会担心生的库跟踪在扔来很时怎么是的保留。这当过去也许是免容许的。然而在.NET4.5惨遭,这个范围为改动掉了,通过一个叫做ExceptionDispatchInfo的接近,即一个搭档十分的捕捉,抛来同不错的仓库跟踪的好像。

  异步方法呢会发现到特别。在执行异步方法之间有任何特别,都不见面吃捕捉,他们会随着Task的回来而归给调用者。当起这种气象经常,如果调用者在await这个Task,那么深将见面在此处抛出。(译者:之前发生讲到老在异步中见面让传送)。在这种方式下,异常通过调用者传播,会形成一个虚构的仓库跟踪,完全就是比如它发在同步代码中平等。

  异步方法为克觉察到那个。在执行异步方法中发生其他异常,都非会见于捕捉,他们见面就Task的归来而回给调用者。当有这种景象常常,如果调用者在await这个Task,那么稀将会见于此间抛出。(译者:之前有说话到死在异步中会为传送)。在这种办法下,异常通过调用者传播,会形成一个虚拟的库跟踪,完全就是像其发出在共同代码中千篇一律。

           
我管它们乘坐虚拟堆栈跟踪,因为堆栈是一个单线程拥有的如此的定义,并且在异步代码中,当前线程实际的库房和有十分那个线程的堆栈可能是充分不同的。异常捕捉的是用户意图中之库跟踪,而非是C#怎选执行这些办法的细节。

           
我拿它们乘坐虚拟堆栈跟踪,因为堆栈是一个单线程拥有的这样的概念,并且在异步代码中,当前线程实际的堆栈和生非常那个线程的仓库可能是殊不同的。异常捕捉的是用户意图中的库房跟踪,而未是C#怎选执行这些方法的细节。

直至于用前面异步方法还是一路的

截至于亟需前面异步方法还是联合的

  我事先说的,使用await只能消费(调用)异步方法。直到await结果有,这个调用方法的言辞以调用他们之线程中运作,就如一头方法同样。这好富有现实意义,尤其是坐一个合的长河做到具有异步方法链时。(译者:当用await的时光,的确就是比照同的依次来执行)

  我事先说之,使用await只能消费(调用)异步方法。直到await结果有,这个调用方法的口舌以调用他们的线程中运行,就如一块方法一致。这挺富有现实意义,尤其是为一个联名的经过得有着异步方法链时。(译者:当以await的下,的确就是按照联合的一一来实行)

  还记得之前异步方法暂停在率先软相见await时。即使这样,它有时为未待暂停,因为偶然await的Task已经好了。一个Task已经深受得的情如下:

  还记得之前异步方法暂停在首先不行碰到await时。即使这样,它有时也未待暂停,因为有时候await的Task已经好了。一个Task已经让得的动静如下:

  
·他是为创造好的,通过Task.FromResult工具方法。我们用会见于第七章节详细探索。

  
·他是受创造好的,通过Task.FromResult工具方法。我们以见面于第七段详细探索。

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

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

   ·它运行一个实在的异步操作,但是现在一度就了(很可能是由目前线程在撞await之前就召开了几许事情)。

   ·它运行一个真的异步操作,但是本已完结了(很可能是由目前线程在碰到await之前曾做了几许事情)。

  
·它于一个相遇await的asunc方法返回,但是所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依次执行,逐个返回,最后才回到结果到最可怜的章程,也即是率先只措施,有哲人来提出此的看法吗?)

  由于最后一个可能,一些好玩的政工时有发生在公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>。(异步:既然方法链中起一个要异步,那么即使见面影响整都应用异步)。

  
你可能会存疑为什么以第一栽要第二种植情况下还用async。如果这些措施承诺一直同的回到,你是毋庸置疑的,并且这样形容同步的代码效率超过异步并且没有await的过程。然后,这只是方式齐返回的景。比如,一个法缓存其结果到外存中,并于缓存可用之当儿,结果可以于合地回来,但是当它们用异步的网要。当您懂得发生一个吓会给您采取异步方法,在某种程度上您或许还眷恋使术返回Task或者Task<T>。(异步:既然方法链中来一个设异步,那么就会潜移默化整体都用异步)。

写于最后

写于最终

  关于异步我还有为数不少疑惑,也是就文章逐步掌握,我啊盼望会抢一些什么。

  关于异步我还有众多疑惑,也是就文章逐步了解,我也愿意能够尽快一些什么。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注