Asp.Net 为什么需要异步
之前看过别人提出为什么在本是多线程的Asp.Net下需要异步环境的时候,提出在Asp.Net环境下本身就是多线程,每个请求就是由一个专门IIS线程负责(咱不说Core下无IIS的情况)。所以以此推论Asp.Net下的异步是没有任何意义的,且由于异步的线程上下文保存和上下文切换的原因只会损害性能,百害而无一利。
然后我表示难道你不知道IIS线程是宝贵的线程,而异步线程则是线程池廉价线程,异步提升的是吞吐量而不是响应速度等云云。。。
在此不是要来撕逼,而是以此作为抛砖引玉,翻译一下 Async In C#5第二章节里Web Application Server Code章节里相关内容以此论证在Web里异步是有意义的:
Asp.Net网站服务器没有类似UI线程这样的单线程限制(上一章节里所讨论UI线程的异步).但是在Web里使用异步仍然是有好处的,长时(Long-Running),操作特别是数据库查询,这在Web应用程序里是非常常见的操作
根据IIS的版本不同,Web站点将会有请求处理线程的限制(IIS线程),这将影响正在处理的并发请求数量的总数.如果你的请求需要耗费大量时间等待数据库查询,那么你或许需要增加你的服务器以便处理更多并发而来的请求.
当一个线程被阻塞的时候,它没有使用任何Cpu资源,但你不能假设这个线程没有占用任何服务器资源.实际上阻塞的线程可能会导致两个重大的瓶颈
①内存:
每一个托管线程都需要保留大概1M大小的虚拟内存.这在只有十几条线程的时候不是什么问题.但如果在使用上百条线程的时候这很容易失控.如果内存经常在交换(指内存条里的内存数据交换到硬盘里的虚拟内存文件),在该线程恢复(Resuming)运行的时候将会变得相当慢.
②调度:
操作系统的调度器负责决定哪条线程在什么时间可以被Cpi执行.无论该线程是否被阻塞,调度器都必须要考虑每条线程的情况,去确认它什么时候会变成不阻塞的状态.这个上下文的切换(指各个线程之前来回切换确认状态)是一个缓慢的操作,这将会拖慢整个系统.
上述的问题将直接体现在服务器的延迟增加和吞吐量的下降.
异步代码的主要特征在于,线程启动一个长时(Long-Running)操作后就被释放了然后去做其他事情(比如去处理其他用户的请求).具体到Asp.Net里,线程来源于线程池, 所以它(那条线程)将在那个长时(Long-Running)操作执行期间返回到线程池里去处理其它的请求.所以可以用更少的线程来处理更多的请求.
个人总结:
异步提升的不是性能或者响应时间,而是吞吐量
异步代码理论上应该是比同步代码慢(由于异步作了并行的另当别论),但是能提升服务器的吞吐量我觉得这个是值得的.
另外个人推荐大部分Http请求和可以预测的较慢的Sql请求都应该走异步,这些是我个人认为比较"慢"且比较能体现出异步的意义的使用环节
Asp.Net 为什么需要异步的更多相关文章
- ASP模拟POST请求异步提交数据的方法
这篇文章主要介绍了ASP模拟POST请求异步提交数据的方法,本文使用MSXML2.SERVERXMLHTTP.3.0实现POST请求,需要的朋友可以参考下 有时需要获取远程网站的某些信息,而服务器又限 ...
- ASP.NET之自定义异步HTTP处理程序(图文教程)
前面我们学习了关于关于自定义同步HTTP处理程序,相信大家可能感觉有所成就,但是这种同步的机制只能对付客户访问较少的情况或者数据处理量不大的情况,而今天这篇文章就是解决同步HTTP处理程序的这个致命缺 ...
- Asp.net+jquery+ajaxpro异步仿Facebook纵向时间轴效果
Asp.net+jquery+ajaxpro异步仿Facebook纵向时间轴效果 在一个项目中,用到了时间轴展示产品的开发进度,为了更好用户体验,想到了Facebook的timeline效果, 搜了一 ...
- ASP.NET WebForm中异步请求防止XSRF攻击的方法
在ASP.NET MVC中微软已经提供了如何防止跨域攻击的方法.对于传统Webfrom中使用Handler来接受ajax的Post请求数据,如何来防止XSRF攻击呢.这里给大家提供一个简单地方法,和M ...
- 看stackoverflow大牛如何回答何时在ASP.NET中使用异步控制器?
转载自博客园:http://farb.cnblogs.com/ 今天无意中看到stackoverflow上一个很好的问答,个人觉得很有价值,所以翻译过来和大家共享!希望大家能相互交流. 在ASP.NE ...
- ASP.NET MVC 4 异步加载控制器
ASP.NET 4 Developer preview中的异步操纵器 在放弃了对.NET 3的支持之后, ASP.NET MVC 4 彻底拥抱了Task类库, 你不需求再蛋疼的给每个Action写两个 ...
- ASP.NET 2.0 异步页面原理浅析 [1]
与 ASP.NET 1.0 相比,ASP.NET 2.0 的各方面改进可以说是非常巨大的.但就其实现层面来说,最大的增强莫过于提供了对异步页面的支持.通过此机制,编写良好的页面可以将数据库.WebSe ...
- ASP.NET线程与异步
什么是线程? 线程简单来说就是一种数据结构,用来管理这个程序的执行状态,其中包括 1.线程核心对象->寄存器的状态 2.线程环境块,是一块用户模式下的内存,包含线程的异常处理链的头部.线程的局部 ...
- ASP.NET MVC 文件异步上传问题处理
最近在做一个网站,用asp.net MVC4.0来开发,今天遇到了个小问题,通过查找相关渠道解决了,在这里把这个问题写出来,问题非常简单,不喜勿喷,mark之希望可以给遇到相同问题的初学者一点帮助.我 ...
随机推荐
- Run Away 模拟退火
Run Away Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- Tensorflow学习教程------创建图启动图
Tensorflow作为目前最热门的机器学习框架之一,受到了工业界和学界的热门追捧.以下几章教程将记录本人学习tensorflow的一些过程. 在tensorflow这个框架里,可以讲是若数据类型,也 ...
- JavaScript链式调用
1.什么是链式调用? 这个很容易理解,例如 $('text').setStyle('color', 'red').show(); 一般的函数调用和链式调用的区别:链式调用完方法后,return thi ...
- Window window = Window.GetWindow(控件)
Window window = Window.GetWindow(控件)
- ovs2.7 在系统重启后,再次使用时提示数据库无法连接的问题。
问题现象如下,ovs开始安装后,对ovs的操作是正常的,但是,现在系统重启后,OVS的操作第一条命令就失败,如下: 问题解决方法: 参考 http://blog.csdn.net/xyq54/art ...
- 开源API集成测试工具 Hitchhiker v0.2更新 - 压力测试
Hitchhiker 是一款开源的 Restful Api 集成测试工具,支持Schedule, 数据对比,压力测试,可以轻松部署到本地,和你的team成员一起管理Api. 详细介绍请看: http: ...
- 【转载】quickLayout.css-快速构建结构兼容的web页面
文章转载自 张鑫旭-鑫空间-鑫生活 http://www.zhangxinxu.com/wordpress/ 原文链接:http://www.zhangxinxu.com/wordpress/?p=4 ...
- 安装Sublime Text 3插件的方法:
安装Sublime Text 3插件的方法: 朋友们,小站活着不容易,全靠广告费养着了,如果本文对你有帮助.麻烦动下手点下页面的广告吧,谢谢! 直接安装 安装Sublime text 2插件很方便,可 ...
- CMake必知必会
CMake 文档 https://cmake.org/cmake/help/v3.7/index.html 需要阅读的文档 item note link cmake-buildsystem(7) cm ...
- Vue directive 回调运用
Vue的官方自定义directive,基本调用简洁如下: Vue.directive('my-directive', { bind: function () {},// 指令与被绑定元素第一次绑定时触 ...