ASP.NET MVC4 异步控制器 - 为啥要使用?
Posted
技术标签:
【中文标题】ASP.NET MVC4 异步控制器 - 为啥要使用?【英文标题】:ASP.NET MVC4 Async controller - Why to use?ASP.NET MVC4 异步控制器 - 为什么要使用? 【发布时间】:2013-02-17 20:46:19 【问题描述】:我试图了解为什么以及何时应该使用async
控制器操作。最终,当我在其中使用await
时,它将等待操作完成以返回视图。
例如
public async Task<ActionResult> TryMe()
await SomeActionAsync();
return View();
在这种情况下,如果我使用async
或不使用async
,Action 将花费相同的时间来执行。
如果我不尝试并行运行至少 2 个慢速操作(不相互依赖),我看不出有任何理由使用 async
控制器操作。
如果我错了,请纠正我。我想我在这里遗漏了一些东西。
【问题讨论】:
【参考方案1】:await
关键字的意义在于让您使用异步操作而无需编写丑陋的回调。
使用异步操作有助于避免浪费线程池线程。
说明
ASP.Net 在托管线程池的线程中运行您的所有代码。 如果一次运行的慢请求太多,线程池将满,新的请求需要等待线程释放。
但是,您的请求通常很慢并不是因为它们正在执行计算(计算绑定),而是因为它们正在等待其他东西,例如硬盘、数据库服务器或外部 Web 服务(IO - 或网络绑定)。
仅仅为了等待外部操作完成而浪费宝贵的线程池线程是没有意义的。
异步操作允许您启动操作,将线程返回到池中,然后在操作完成后“唤醒”另一个线程池线程。 在操作运行期间,不消耗任何线程。
【讨论】:
所以,你的意思是我应该使用异步方法(如你所说的操作(DB、文件系统、WS 等)来释放线程池?因为执行时间会两种方式都保持不变。当我尝试运行这样的操作时,始终使用异步是最佳做法吗? @DorR:是的。请注意,并非所有操作都必须具有异步实现。 .Net 4.5 中的大多数非 CPU 绑定方法现在都有异步对应项,但第 3 方库不太可能。 Steve Sanderson 的精彩演讲展示了 ASP.NET 中的异步功能:channel9.msdn.com/Events/TechDays/Techdays-2012-the-Netherlands/… 该演示文稿还清楚地展示了使用异步方法可能带来的性能优势。 所以在应用中使用这个关键字非常好。在小和大。对吗? @Tim:只有在有非阻塞(非计算绑定)工作时才应该使用异步。以上是关于ASP.NET MVC4 异步控制器 - 为啥要使用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的异步 ASP.NET Web API 控制器阻塞了主线程?
为啥 Asp.net MVC4 不能使用 SQL Server Session 状态存储的 cookieless
将复选框的值传递给 asp.net mvc4 中的控制器操作
翻译转载官方教程Asp.Net MVC4入门指南:添加一个控制器