之前看过别人提出为什么在本是多线程的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 为什么需要异步的更多相关文章

  1. ASP模拟POST请求异步提交数据的方法

    这篇文章主要介绍了ASP模拟POST请求异步提交数据的方法,本文使用MSXML2.SERVERXMLHTTP.3.0实现POST请求,需要的朋友可以参考下 有时需要获取远程网站的某些信息,而服务器又限 ...

  2. ASP.NET之自定义异步HTTP处理程序(图文教程)

    前面我们学习了关于关于自定义同步HTTP处理程序,相信大家可能感觉有所成就,但是这种同步的机制只能对付客户访问较少的情况或者数据处理量不大的情况,而今天这篇文章就是解决同步HTTP处理程序的这个致命缺 ...

  3. Asp.net+jquery+ajaxpro异步仿Facebook纵向时间轴效果

    Asp.net+jquery+ajaxpro异步仿Facebook纵向时间轴效果 在一个项目中,用到了时间轴展示产品的开发进度,为了更好用户体验,想到了Facebook的timeline效果, 搜了一 ...

  4. ASP.NET WebForm中异步请求防止XSRF攻击的方法

    在ASP.NET MVC中微软已经提供了如何防止跨域攻击的方法.对于传统Webfrom中使用Handler来接受ajax的Post请求数据,如何来防止XSRF攻击呢.这里给大家提供一个简单地方法,和M ...

  5. 看stackoverflow大牛如何回答何时在ASP.NET中使用异步控制器?

    转载自博客园:http://farb.cnblogs.com/ 今天无意中看到stackoverflow上一个很好的问答,个人觉得很有价值,所以翻译过来和大家共享!希望大家能相互交流. 在ASP.NE ...

  6. ASP.NET MVC 4 异步加载控制器

    ASP.NET 4 Developer preview中的异步操纵器 在放弃了对.NET 3的支持之后, ASP.NET MVC 4 彻底拥抱了Task类库, 你不需求再蛋疼的给每个Action写两个 ...

  7. ASP.NET 2.0 异步页面原理浅析 [1]

    与 ASP.NET 1.0 相比,ASP.NET 2.0 的各方面改进可以说是非常巨大的.但就其实现层面来说,最大的增强莫过于提供了对异步页面的支持.通过此机制,编写良好的页面可以将数据库.WebSe ...

  8. ASP.NET线程与异步

    什么是线程? 线程简单来说就是一种数据结构,用来管理这个程序的执行状态,其中包括 1.线程核心对象->寄存器的状态 2.线程环境块,是一块用户模式下的内存,包含线程的异常处理链的头部.线程的局部 ...

  9. ASP.NET MVC 文件异步上传问题处理

    最近在做一个网站,用asp.net MVC4.0来开发,今天遇到了个小问题,通过查找相关渠道解决了,在这里把这个问题写出来,问题非常简单,不喜勿喷,mark之希望可以给遇到相同问题的初学者一点帮助.我 ...

随机推荐

  1. Iframe刷新页面

    window.parent.frames["name"].location="url";

  2. 浅谈Java接口

    接口(英文:Interface)是Java中非常重要的内容,初学的时候可能感受不深,但是在做项目的时候,对面向接口编程的运用就变得尤为重要,不过这是后话了.现在先讨论假如是刚刚接触接口这个概念,该怎么 ...

  3. Python通过future处理并发

    future初识 通过下面脚本来对future进行一个初步了解:例子1:普通通过循环的方式 import os import time import sys import requests POP20 ...

  4. python爬虫之获取验证码登陆

    #--coding:utf-8#author:wuhao##这里我演示的就是本人所在学校的教务系统#import urllib.requestimport urllib.parseimport rei ...

  5. 安装阿里Java代码规约插件

    概述 2017年10月14日杭州云栖大会,Java代码规约扫描插件全球首发仪式正式启动,规范正式以插件形式公开走向业界,引领Java语言的规范之路.目前,插件已在云效公有云产品中集成,立即体验!(云效 ...

  6. Caused by: java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required

    概述 看到异常 一般就知道 在使用JdbcTemplate 需要购入数据源, 购入数据源的方式有两种,一种是xml 配置 在DAO层注入数据源, 另一种是在xml 中 配置模版JdbcTemplate ...

  7. angular.js基础

    内置指令 所有的内置指令的前缀都为ng,不建议自定义指令使用该前缀,以免冲突.首先从一些常见的内置指令开始.先列出一些关键的内置指令,顺便简单说说作用域的问题. ng-model 将表单控件和当前作用 ...

  8. LINUX 笔记-tee命令

    作用:把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中 格式:tee filename 例:who | tee who.out 使用who命令,结果输出到屏幕上,同时保存在who.out文 ...

  9. 探索equals()和hashCode()方法

    探索equals()和hashCode()方法 在根类Object中,实现了equals()和hashCode()这两个方法,默认: equals()是对两个对象的地址值进行的比较(即比较引用是否相同 ...

  10. 实验之-----------修改oracle实例名

    --查询当前数据库实例名称: SQL> select instance_name,status from v$instance; INSTANCE_NAME STATUS------------ ...