May*_*ank 44 c# async-await .net-4.5
异步任务(异步/等待)如何在.Net 4.5中运行?
一些示例代码:
private async Task<bool> TestFunction()
{
var x = await DoesSomethingExists();
var y = await DoesSomethingElseExists();
return y;
}
Run Code Online (Sandbox Code Playgroud)
第二个await
陈述是立即执行还是在第一次await
返回后执行?
nik*_*eee 15
它在第一次await返回后执行.如果这件事让您困惑,请尝试使用断点 - 新的异步模式完全支持它们.
想象一下它会是这样的:
var x = await GetSomeObjectInstance();
var y = await GetSomeObjectInstance2(x);
Run Code Online (Sandbox Code Playgroud)
可能会在某处发生NullReferenceException,因此第一个await 必须先返回.否则,x
将为null/undefined或其他.
ris*_*ism 13
方法调用仍将按顺序发生,就像"常规",无休止的方法调用一样.等待的目的是它将当前线程返回到线程池,而等待操作运行并执行任何操作.
这在高性能环境中尤其有用,例如Web服务器,其中给定请求在整个线程池的给定线程上处理.如果我们不等待,那么在db/service调用完成时,处理请求的给定线程(及其所有资源)将保持"正在使用"状态.这可能需要几秒钟或更长时间,尤其是对于外部服务调用.
现在在流量较低的网站上,这不是什么大问题,但在高流量网站中,所有这些请求线程的成本只是坐在一起,什么都不做,处于"使用中"状态,等待其他进程,如db/service调用返回可能是一种资源负担.
我们最好将线程释放回工作池,以允许它为其他请求执行其他有用的工作.
一旦db/service调用完成,我们就可以中断线程池并要求一个线程继续处理从中断处停止的请求.此时,重新加载请求的状态,并继续进行方法调用.
因此,在使用await时,在每个请求的基础上,从用户的角度来看,请求仍将花费相同的时间 ...加上一个微小的微小更多的开关开销.
但总体而言,在所有用户的所有请求中,事情似乎对所有用户都更有效,因为Web服务器(在这种情况下)运行效率更高,资源利用率更高.即它要么不必排队等待免费线程处理请求的请求,因为等待返回它们,要么我们不必购买更多硬件,因为我们使用相同数量的硬件,更有效率,以获得更高吞吐量.
尽管如此,尽管您在默认模板和许多文档中看到了这种情况,但您不应该盲目地使用等待每一次调用.它只是一个工具,就像它所有的工具一样.如果转换成本不低于同步完成呼叫的成本,则不应使用等待.