.Net 4.5中Async / Await的简要说明

asynchronous任务(Async / Await)在.Net 4.5中如何工作?

一些示例代码:

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

第二await声明是立即执行还是在第一次await回报之后执行?

await暂停方法,直到操作完成。 所以第二个await会在第一个await返回之后被执行。

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

它在第一次等待返回之后执行。 如果这件事情让你感到困惑,那就试着去玩弄断点吧 – 它们完全被新的asynchronous模式所支持。

想象一下,看起来像这样:

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

有可能会发生一个NullReferenceException,所以第一个等待必须先返回。 否则, x将是null / undefined或其他。

方法调用仍然会像“常规”,不等待的方法调用那样依次发生。 等待的目的是当等待的操作运行时它将当前线程返回到线程池,并执行任何操作。

这在高性能的环境中特别有用,比如web服务器,在给定的线程上从给定的线程池中处理给定的请求。 如果我们不等待,那么给定的线程处理请求(及其所有资源)在db / service调用完成时仍然处于“正在使用”状态。 这可能需要几秒钟或更长时间,尤其是对于外部服务呼叫。

现在在低stream量的网站,这是一个问题不大,但在高stream量的网站,所有这些请求线程的成本只是坐在一起,什么也不做,在“使用中”的状态,等待其他进程,如db /服务调用返回可能是一种资源负担。

我们最好将线程释放回工作池,以便为其他请求做其他有用的工作。

一旦db / service调用完成,我们就可以中断线程池并请求一个线程继续处理该请求。 在这一点上,请求的状态被重新加载,方法调用继续。

因此,在使用await的情况下,每次请求时,从用户的angular度来看,请求仍然需要花费相同的时间 ……再加上更多的开销开销。

但总的来说,在对所有用户的所有请求中,由于Web服务器(在这种情况下)的运行效率更高,资源利用率更高,因此对所有用户而言,情况看起来会更好。 即它不必排队等待空闲线程处理请求的请求,因为等待正在返回它们,或者我们不必购买更多的硬件,因为我们使用相同数量的硬件,更高效地获得更高的吞吐量。

尽pipe如此,尽pipe你在默认模板中看到了一些转换成本,但在许多文档中,你不应该盲目地使用它来等待每一次调用。 它只是一个工具,就像所有工具一样。 如果转换成本不低于同步完成您的呼叫的成本,那么你不应该使用等待。