ASP.NET MVC4 异步控制器 - 为什么要使用?

36
我正在尝试理解何时应该使用异步控制器操作,以及为什么要使用它。最终,在其中使用await时,它将等待操作完成才会返回View。
例如:
public async Task<ActionResult> TryMe()
{
   await SomeActionAsync();
   return View();
}

在这种情况下,无论我是否使用asyncAction执行所需的时间都相同。
如果我不尝试并行运行至少两个不相互依赖的缓慢操作,我不认为有任何理由使用async控制器操作。
如果我错了,请纠正我。我觉得我在这里漏掉了什么。
1个回答

52
await关键字的作用是让您在不编写丑陋的回调函数的情况下使用异步操作。
使用异步操作有助于避免浪费线程池线程。

解释

ASP.Net在托管线程池中运行所有代码。
如果同时有太多缓慢的请求运行,线程池将变满,并且新请求需要等待线程空闲。
然而,通常您的请求之所以缓慢并不是因为它们正在进行计算(计算密集型),而是因为它们正在等待其他东西,例如硬盘、数据库服务器或外部Web服务(IO-或网络密集型)。
浪费一个宝贵的线程池线程仅仅为了等待外部操作完成是没有意义的。
异步操作允许您启动操作,将线程返回到池中,然后在操作完成时在不同的线程池线程上“唤醒”。
在操作运行时,不会消耗任何线程。

所以,您的意思是说我应该使用异步方法(针对您提到的操作,如DB、文件系统、WS等)仅为了释放线程池?因为执行时间在两种方式中都不会有所改变。尝试运行此类操作时,始终使用异步是否是最佳实践? - DorR
@DorR:是的。请注意,并非所有操作都一定有异步实现。.Net 4.5中大多数非CPU绑定方法现在都有异步对应方法,但第三方库可能不太可能有。 - SLaks
9
这里有一份来自Steve Sanderson的精彩演讲,展示了ASP.NET中的异步功能:http://channel9.msdn.com/Events/TechDays/Techdays-2012-the-Netherlands/2287 该演示清晰地展示了使用异步方法所带来的性能优势。 - Erik Schierboom
那么在应用程序中使用这个关键字是非常好的,无论是在小型还是大型应用中都是正确的吗? - Persian.
这里实际上有两个问题:“为什么”和“何时”。这个答案对第一个问题做得很好。如果有人回答第二个问题会很有帮助。例如,它应该在任何实用的情况下使用,还是仅在大型应用程序、返回大量数据的视图、计算受限的视图等情况下使用? - Tim
1
@Tim:只有在你有非阻塞(非计算密集型)的工作时才应该使用异步。 - SLaks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接