34

我想了解为什么以及何时应该使用async控制器操作。最终,当我在其中使用await时,它将等待操作完成以返回视图。ASP.NET MVC4异步控制器 - 为什么要使用?

例如

public async Task<ActionResult> TryMe() 
{ 
    await SomeActionAsync(); 
    return View(); 
} 

在这种情况下,如果我使用async或不使用async,在行动将采取相同的时间执行。

如果我没有试图并行运行至少2个慢速操作(并不依赖于对方),我没有看到任何使用控制器操作的理由。

如果我错了,请纠正我。我想我在这里错过了一些东西。

回答

50

await关键点的目的是让您在不写丑陋回调的情况下使用异步操作

使用异步操作有助于避免浪费线程池线程。

说明

ASP.Net运行所有的代码从托管线程池中的线程。
如果您一次运行的请求太多,线程池将会满,并且新的请求将需要等待线程获得空闲。

然而,您的请求通常很慢,并不是因为它们正在执行计算(计算绑定),而是因为它们正在等待其他内容,如硬盘,数据库服务器或外部Web服务( IO-或网络绑定)。

浪费珍贵的线程池线程只是为了等待外部操作完成没有意义。

异步操作允许您启动操作,将您的线程返回到池中,然后在操作完成时在不同的线程池线程上“唤醒”。
运行正在运行时,不消耗线程。

+0

因此,你所说的是我应该使用异步方法(如你所说的操作(DB,文件系统,WS等)来释放线程池?因为执行时间将保持不变当我尝试运行这样的操作时,总是使用异步是最好的做法吗? – DorR 2013-03-03 20:02:33

+0

@DorR:是的,注意并不是所有的操作都必须有异步实现,.Net 4.5中的大多数非CPU绑定方法现在都有异步但是第三方库不太可能 – SLaks 2013-03-03 20:21:29

+9

Steve Sanderson在ASP.NET中展示了异步功能:http://channel9.msdn.com/Events/TechDays/Techdays-2012-the -Nelandlands/2287此演示文稿还清楚地显示了使用异步方法可能会带来的性能优势 – 2013-03-06 15:04:57