转载自博客园: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. CSS自适应布局(包括两边宽度固定中间宽度自适应与中间宽度固定两边宽度自适应)

    1.两边宽度固定,中间宽度自适应 (1)非CSS3布局,浮动定位都可以(以下用浮动) css样式: #left { float: left;width: 200px; background: lime ...

  2. 实现十进制无符号整数m到十六进制数的转换功能

    /*利用顺序栈结构,编写算法函数void Dto16(unsigned int m)实现十进制无符号整数m到十六进制数的转换功能.*//******************************** ...

  3. Echarts给柱状图每一条顶部都添加数值

    在 series中添加 itemStyle : { normal: {label : {show: true}}}, 不过目测要把markPoint等去掉,不然最大值和最小值会和label冲突,应该有 ...

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

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

  5. hadoop多次搭建后,完整总结(累死宝宝了,搭建了十多遍了)

    1.安装JDK1.1上传运用软件FileZilla,将windows上的jdk压缩包放到linux的root目录下 1.2解压jdk #创建文件夹 mkdir /usr/java(不要挂在在" ...

  6. Linux下Chrome浏览器不支持WebGL的解决方式。

    今天使用Chrome浏览器,总是报这样一个错误: Uncaught TypeError: Cannot read property 'canvas' of null. 细看之下是无法获取WebGL上下 ...

  7. 关于PDV的那些事

    数据集中的数据来源分为两种: 一.来自于另一个数据集: 二.来自于外部数据源(本文细说此来源): 无论是哪种来源,在它们成为目标数据集中的观测行(官方叫它observation)之前都要进入PDV,先 ...

  8. nil、Nil、NULL和NSNull的理解

    http://blog.sina.com.cn/s/blog_4930f8e60101h71b.html 其实早就想研究一下nil.Nil.NULL和NSNull之间的区别,只是工作上除了nil,其它 ...

  9. LightHttpd源码分析

    源码:https://github.com/EZLippi/Tinyhttpd 要在Linux中编译,无需像代码注释所说那样: /* This program compiles for Sparc S ...

  10. styleId妙用

    styleId妙用: <html:text property="etpsBlocReg.cptlTotal" style="width: 94%;" re ...