在.NET 4.5异步/等待的简要说明(Brief explanation of Async/Awa

2019-07-02 15:54发布

如何异步任务(异步/等待)工作.NET 4.5?

一些示例代码:

private async Task<bool> TestFunction()
{
  var x = await DoesSomethingExists();
  var y = await DoesSomethingElseExists();
  return y;
}

请问第二await语句得到执行马上或第一后await回报?

Answer 1:

await直到操作完成暂停方法。 所以第二await会后的第一个得到执行await回报。

欲了解更多信息,请参阅我的async / await介绍或官方FAQ 。



Answer 2:

它第一的await返回后执行。 如果这件事情混淆了你,试图玩弄断点 - 它们是由新的异步模式完全支持。

想象一下,它应该是这样的:

var x = await GetSomeObjectInstance();
var y = await GetSomeObjectInstance2(x);

有可能会出现一个NullReferenceException的地方,所以第一的await 必须先返回。 否则, x是空/未定义或什么的。



Answer 3:

该方法的调用仍然会依次发生,就像“普通”,非等待方法调用。 AWAIT的目的是,虽然期待已久的操作逃跑和为所欲为它将返回当前线程的线程池。

这是在高性能环境下特别有用,比如网络服务器,其中一个给定的请求从整体线程池中指定线程的处理。 如果我们不等待,然后给定线程处理请求(和它所有的资源)仍然是“使用”,而DB /服务调用完成。 这可能需要几秒钟或更尤其是对外部服务的调用。

现在,在低流量的网站,这不是大问题,但在高流量的网站,所有这些请求的线程只是坐在那里,什么都不做,在“使用中”状态,等待像DB /服务电话等工序成本返回可以是资源的负担。

我们关闭释放线程回工作者池允许它用于其他一些要求做其他有用的工作做得更好。

一旦DB /服务调用完成后,我们就可以中断线程池,并要求线程进行从那里离开请求处理。 在这一点上请求的状态重新加载并调用该方法继续进行。

因此,在每个请求的基础使用的await时,请求将仍然需要从用户的角度看时间是相同的 ,加上一个小小的【熊多为切换开销。

但在总体上,跨越所有用户的所有请求,事情似乎更高性能的所有用户使用的网络服务器(在这种情况下)具有更好的资源利用率更高效地运行。 也就是说,它要么不必排队等待的请求免费线程来处理请求,因为是的await返回它们或作为选择,我们没有,因为我们使用相同的硬件数量,更有效地,以获得更高的购买更多的硬件吞吐量。

有一个切换成本这虽然尽管这样你在默认模板看到,在许多文档,你不应该只是一味地等待使用为每一个电话。 这只是一个工具,像所有的工具,它有它的地方。 如果开关成本并不比刚刚完成你的电话同步,那么你不应该使用等待更低的成本。



文章来源: Brief explanation of Async/Await in .Net 4.5