看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 ...
随机推荐
- Java和Ibatis调用存储过程并取得返回值详解
Java和Ibatis调用存储过程并取得返回值详解 2011-07-19 17:33 jiandanfeng2 CSDN博客 字号:T | T 本文主要介绍了Java和Ibatis调用存储过程的方法, ...
- (Python )格式化输出、文件操作、json
本节学习Python的格式化输出,文件操作以及json的简单用法 1.格式化输出 将非字符串类型转换成字符串,可以使用函数:str() 或者repr() ,(这两个函数的区别目前我还没搞懂,求解答) ...
- 移动平台对于META标签的定义[转]
下面介绍一些有关标记的例子及解释. 一.meta 标签分两大部分:HTTP 标题信息(http-equiv)和页面描述信息(name). 1.http-equiv 属性的 Content-Type 值 ...
- 实验 2 用C语言编写简单程序
#include<stdio.h> int main() { int x,y; printf("enter x:"); scanf("%d",&am ...
- oracle权限语句大全
Oracle 系统默认的几个用户: sys --------网络管理用户,具有最高数据库管理权限 system------本地管理用户,权限次于sys scott-------普通用户,默认是锁住的( ...
- Linux 如何安装memcache?
原有memcache所在机器损坏,需要在新的Linux机器上安装memcache,具体步骤如下: 1.使用Linux机器的root权限登陆 2.安装libevent 下载地址:http://libev ...
- Python解决八皇后问题
最近看Python看得都不用tab键了,哈哈.今天看了一个经典问题--八皇后问题,说实话,以前学C.C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的 ...
- Activity设置全屏的三种方法
1.super.onCreate(savedInstanceState)方法之前调用: setTheme(android.R.style.Theme_Light_NoTitleB ...
- matlab资源
百度网盘 链接:http://pan.baidu.com/s/1c06ikEW 密码:9dpt包含matlab6.5,7,7.01,7.04,7.1,Matlab2006b(7.3),Matlab ...
- A very cool thing: Install MYSQL from source without root access on LINUX
最近由于工作的需要,要在centos上安装MYSQL服务器.作为一名小兵中的小兵,当然是没有root权限的,为了能够使用mysql,只能使用源码安装了(因为binary安装方式似乎需要root acc ...