转载自博客园:http://farb.cnblogs.com/

今天无意中看到stackoverflow上一个很好的问答,个人觉得很有价值,所以翻译过来和大家共享!希望大家能相互交流。

在ASP.NET MVC中何时使用异步控制器(Async Controllers)?

在ASP.NET MVC中使用异步操作的时候,我有这么几个关注点。异步操作何时提高我应用的性能,什么时候没改善?

  1. 在ASP.NET MVC中到处使用异步操作真的好吗?
  2. 对于可等待的(awaitable)方法: 当查询数据库时(通过EF/BHibernate/其他的ORM)应该使用async/await关键字吗?
  3. 在一个单独的操作方法中,异步地查询数据库可以使用await关键字多少次?

当一个action必须执行多个独立的长期运行的操作时,异步action方法是很有用的。
假设我有三个操作,分别耗时500, 600和700毫秒。采用同步调用的话,总共的响应时间将会稍微超过1800毫秒。然而,如果是异步调用(并发),总共响应时间将会稍微超过700毫秒,因为那是最长的任务/操作的持续时间。

异步控制器类一个经典的用法是用于长期运行的Web服务调用。

数据库应该异步调用吗?

IIS线程池经常可能处理比一个数据库服务器更多的阻塞请求。如果数据库遇到了瓶颈,那么异步的调用并不会加速数据库的响应。由于没有限流机制,使用异步调用有效地分发更多的任务给一个不知所措的数据库服务器只会给数据库转移更多的负担。如果你的数据库遇到了瓶颈,异步调用不会是魔弹。

而且,异步并不意味着并发。异步执行释放了一个没有复杂度或性能损耗的外部资源阻塞的有价值的线程池线程。这意味着相同的IIS机器可以处理更多的并发请求,而不是它将运行的更快。

可以在MSDN上看一下这篇文章。作者花了很多精力在这篇博客上描述何时应该在ASP.NET中使用async而不是如何使用。

答标题问题:

首先,要理解async/await是释放线程的根本。在GUI应用中,主要释放GUI线程,因此用户体验更好。在服务器应用(包括ASP.NET MVC)中,主要释放请求线程,因此服务器可以扩展。

特别地,它不会:

让你的个人请求完成的更快。事实上,他们会完成的(只有一点点)更慢。当遇到一个await时,就会返回到调用者/浏览器。await只会向ASP.NET线程池“屈服”,而不是浏览器。

答问题1:

当你要进行I/O时,我可以说到处使用异步操作是好的。虽然它可能不一定是有益的(看下面)。

然而,对于CPU受限的方法使用异步操作是不好的。有时开发者认为通过在控制器中调用Task.Run可以获得async的好处,这是一个可怕的观点。因为那样的代码通过开启其他线程来结束释放该请求线程,因此根本没有受益(事实上,他们消耗了额外线程切换的开销)。

答问题2:

你可以使用你可利用的任何可等待的方法。如果你的ORM不支持async,那么不要尝试把它包装在Task.Run或者任何和那个相似的东西里。

注意我说的是“你可以使用”。如果你在讨论一个单数据库的ASP.NET
MVC,那么(基本上确定)你不会从async获得任何伸缩性的好处。这是因为IIS可以比一个SQL
Server(或者其他经典的RDBMS)的单一实例处理更多的并发请求。然而,如果你的后端是更现代的——SQL server集群, Azure
SQL, NoSQL等等——你的后端可伸缩,并且伸缩性的瓶颈是IIS,那么你可以从async获得伸缩性的好处。

答问题3:

你爱用多少次就用多少次,只要你喜欢。然而,注意许多ORM都有“每次连接一次操作”的原则。特别的,EF每个DbContext只允许一个单独的操作;无论该操作是同步的还是异步的,这都成立。

而且,再次记住你后端的伸缩性。如果你碰上了一个单一实例的SQL Server,且IIS已经可以使SQL Server处于满负荷状态,那么SQL Server双倍或三倍的压力对你一点好处都没有。

看stackoverflow大牛如何回答何时在ASP.NET中使用异步控制器?的更多相关文章

  1. 在 ASP.NET MVC 中使用异步控制器

    线程池 一直想把项目改写成异步,但是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每一个成熟的东西,都要演变好几个 ...

  2. ASP.NET MVC EF 中使用异步控制器

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   为什么使用异步操作/线程池 ASP.NET MVC ...

  3. ASP.NET MVC中使用异步控制器

    线程池 一直想把项目改写成异步,但是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每一个成熟的东西,都要演变好几个 ...

  4. ASP.NET MVC4中的异步控制器

    在抛弃了对.NET 3的支持之后, ASP.NET MVC 4 彻底拥抱了Task类库, 你不需要再蛋疼的给每个Action写两个方法, 也无需傻傻的手动对异步Action计数器增减了(AsyncMa ...

  5. ASP.NET 中的 Async/Await 简介

    本文转载自MSDN 作者:Stephen Cleary 原文地址:https://msdn.microsoft.com/en-us/magazine/dn802603.aspx 大多数有关 async ...

  6. comet在asp.net中的实现

    网上有关“服务器推送”的介绍非常多,其中一种实现方式就是采用comet技术,在浏览器与服务端之间建立一个http协议的“长连接”,所谓“长连接”,就是指浏览器到服务端的http请求不会马上得到服务端的 ...

  7. 充分发挥异步在 ASP.NET 中的强大优势

    作者:Brij Bhushan Mishra 最近几年,异步编程受到极大关注,主要是出于两个关键原因:首先,它有助于提供更好的用户体验,因为不会阻塞 UI 线程,避免了处理结束前出现 UI 界面挂起. ...

  8. Stackdump: 一个可以离线看stackoverflow的工具

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Stackdump: 一个可以离线看stackoverflow的工具.

  9. asp.net中怎样调用存储过程和存储过程的写法(转载,留着自己看)

    asp.net中怎样调用存储过程和存储过程的写法 创建一个只有输入参数的存储过程 create procedure proc_user@name varchar(20),@Password varch ...

随机推荐

  1. 如何更改OS系统下截图生成图片格式 jpg pdf

    Mac系统下快速截屏的快捷键: 1.截全屏: shift + command + 3 2.选取截屏 shift + command + 4 生成的图片,系统默认格式忘了,反正不好用,用下面命令更改生成 ...

  2. PBX220 测评一

    //纯粹个人看法,可能包含非常不恰当的主观看法,敬请见谅. 本次测试的是易用科技Speedytel 新出的产品 PBX-220.      测试环境为:华硕EeePC(IE7).Eyebeam. 先来 ...

  3. NOIP2010 题解

    机器翻译 题解:模拟 #include <cstdio> #include <cstring> ; ], ]; int main(){ memset(, sizeof(in)) ...

  4. Struts2之提交对象数组至后台

    struts2中有许多很好的特性,比如在设置好getter和setter方法后,加上前端的匹配设置,后台即可自动将前端输入的数据转换为后台的相应的对象. 如现在传入一个Person类的对象,其中Per ...

  5. Ubuntu下命令行方式对PDF文件进行缩放、合并、拆分

    安装软件: sudo aptitude install ghostscript 然后执行命令: gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibili ...

  6. 界面显示两个ListView

    1.List界面布局 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:an ...

  7. IDEA 创建Maven Web项目(图文版)

    前言:IDEA作为一款广泛使用的开发工具,无论是后台人员,还是前段工作者,都能在它上面发现它的魅力. IDEA提供了诸多项目模板,今天就以创建Maven Web项目作为示例,和大家一起分享: 第一步: ...

  8. bzoj 3714

    题意:n<=2000的盒子,有一些里面有球,再给你所有c[i][j](1<=i<=j<=n),即告诉你[i,j]里面球的总数的奇偶性需要花费c[i][j],现在求知道所有的盒子 ...

  9. Oracle EBS进化史

    https://blogs.oracle.com/ptian/entry/oracle_ebs%E8%BF%9B%E5%8C%96%E5%8F%B2 通过图表总结了下Oracle EBS的进化历史,回 ...

  10. Java Spring AOP用法

    Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...