看stackoverflow大牛如何回答何时在ASP.NET中使用异步控制器?
转载自博客园:http://farb.cnblogs.com/
今天无意中看到stackoverflow上一个很好的问答,个人觉得很有价值,所以翻译过来和大家共享!希望大家能相互交流。
在ASP.NET MVC中何时使用异步控制器(Async Controllers)?
在ASP.NET MVC中使用异步操作的时候,我有这么几个关注点。异步操作何时提高我应用的性能,什么时候没改善?
- 在ASP.NET MVC中到处使用异步操作真的好吗?
- 对于可等待的(awaitable)方法: 当查询数据库时(通过EF/BHibernate/其他的ORM)应该使用async/await关键字吗?
- 在一个单独的操作方法中,异步地查询数据库可以使用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中使用异步控制器?的更多相关文章
- 在 ASP.NET MVC 中使用异步控制器
线程池 一直想把项目改写成异步,但是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每一个成熟的东西,都要演变好几个 ...
- ASP.NET MVC EF 中使用异步控制器
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 为什么使用异步操作/线程池 ASP.NET MVC ...
- ASP.NET MVC中使用异步控制器
线程池 一直想把项目改写成异步,但是ASP.NETMVC3下写的过于繁琐,.NET 4.5与ASP.NET MVC下代码写起来就比较简单了, MS好像也一直喜欢这样搞,每一个成熟的东西,都要演变好几个 ...
- ASP.NET MVC4中的异步控制器
在抛弃了对.NET 3的支持之后, ASP.NET MVC 4 彻底拥抱了Task类库, 你不需要再蛋疼的给每个Action写两个方法, 也无需傻傻的手动对异步Action计数器增减了(AsyncMa ...
- ASP.NET 中的 Async/Await 简介
本文转载自MSDN 作者:Stephen Cleary 原文地址:https://msdn.microsoft.com/en-us/magazine/dn802603.aspx 大多数有关 async ...
- comet在asp.net中的实现
网上有关“服务器推送”的介绍非常多,其中一种实现方式就是采用comet技术,在浏览器与服务端之间建立一个http协议的“长连接”,所谓“长连接”,就是指浏览器到服务端的http请求不会马上得到服务端的 ...
- 充分发挥异步在 ASP.NET 中的强大优势
作者:Brij Bhushan Mishra 最近几年,异步编程受到极大关注,主要是出于两个关键原因:首先,它有助于提供更好的用户体验,因为不会阻塞 UI 线程,避免了处理结束前出现 UI 界面挂起. ...
- Stackdump: 一个可以离线看stackoverflow的工具
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Stackdump: 一个可以离线看stackoverflow的工具.
- asp.net中怎样调用存储过程和存储过程的写法(转载,留着自己看)
asp.net中怎样调用存储过程和存储过程的写法 创建一个只有输入参数的存储过程 create procedure proc_user@name varchar(20),@Password varch ...
随机推荐
- 用servlet和jsp做探索数据库
1.建一个web文件,在里面分三层,分别是实体层:DAO层,DAO层里面包含BaseDAO(数据访问层)和DAO层:还有一个servlet层,处理数据逻辑层! 一.实体层,建立两个实体,一个membe ...
- python __call__内置函数
__call__实现可以直接调用对象的作用
- bash快捷建
bash快捷建 ctrl键组合ctrl+a:光标移到行首.ctrl+b:光标左移一个字母ctrl+c:杀死当前进程.ctrl+d:退出当前 Shell.ctrl+e:光标移到行尾.ctrl+h:删除光 ...
- 浅谈struts2之chain
转自:http://blog.csdn.net/randomnet/article/details/8656759 前一段时间,有关chain的机制着实困绕了许久.尽管网上有许多关于chain的解说, ...
- 解决Web部署 svg/woff/woff2字体 404错误
在IIS上部署web项目的时候,发现浏览器报找不到woff.woff2字体的错误,导致浏览器加载字体报404错误,由于服务器IIS不认SVG,WOFF/WOFF2 这几个文件类型,只要在IIS上添加M ...
- IAR之文件路径设置
1.命令解释 $PROJ_DIR$表示工程所在路径 $TOOLKIT_DIR$表示IAR安装目录所在头文件路径 \..\表示返回上一级目录. 2.头文件路径设置 打开工程文件,找到"opti ...
- Sprint回顾大揭秘——“宝典”来了
我始终记得当年我作为敏捷教练所做的第一次Sprint回顾,这一切都仿佛就发生在昨天.这家公司实行Scrum有好几年了,我自然而然地认为他们这群人是纪律严明并且成熟稳重的敏捷专家. 因此,当他们计划了一 ...
- padding(内边距)、margin(外边距)、border(边框)
元素的 padding 控制元素内容 content和元素边框 border 之间的距离. 元素的外边距 margin 控制元素边框 border 和元素实际所占空间的距离,如果你将一个元素的 mar ...
- 杨光福IT讲师微博
杨光福IT讲师微博: http://weibo.com/321chinavideo 微博现在里面有很多干货,以后会越来越多,主要用于分享和交流技术.关注一下对你有帮助.
- erlang日志功能。
用cowboy这个库,没有日志功能,所以研究了otp提供的日志功能. 1.启动SASL的方式 erl –boot start_sasl 默认配置文件下启动SASL, {env, [{sasl_erro ...