c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作
ASP.NET MVC 异步控制器及EF异步操作
异步控制器
- ASP.NET MVC2后开始了对异步请求管道的支持,异步请求管道的作用是允许web服务器处理长时间运行的请求,比如
那些花费大量时间等待网络或数据库操作完成的请求仍能保持对其他请求的响应;所以异步主要是高效率而不是提高一个
单独请求的响应速度,尽管异步花费了与同步一样的事件响应用户请求,但在异步管道中,服务器不会因为在等待一个请求
的完成而阻塞其他有用的任务执行
- 理解异步和同步ASP.NET代码的区别
- 首先理解web服务器是如何处理请求的。IIS维护了一个用来服务请求的空闲线程的集合(线程池)。当一个请求进入时,
线程池中的一个线程就别调度用来处理进入的请求。当一个线程正在处理一个请求时,他就不能用来处理其他的请求,直到他
完成第一个请求的处理。IIS同时服务多个请求的能力是基于一个假设:线程池中有空闲的线程来处理进入的请求
- 阻塞线程
- 线程正在等待网络调用完成,因此不能用来执行当前请求的其他任务
- 线程饥饿
- 只要线程池足够大的话,阻塞线程并不是什么大问题;然而在处理多个并发请求的大型应用程序中,可能会因为请求的数量过多而导致
等待数据的请求也多而阻塞了大量的线程,从而导致线程池没有足够的空闲线程来处理新的请求
- 语法
public async Task<ActionResult> News(string city)
{
NewService newService=new NewService();
NewsModel news=await newsService.GetNews(city);
return View(news);
}
- 相比同步操作,只需做三处改动:为操作添加async修饰符,返回类型改为Task,在需要长时间运行的方法前添加await
EF的异步操作
- 增

- Add方法只是导致实体在内存中的修改,SaveChanges方法才是导致命令执行,所以SaveChanges要异步执行
- 删

- Find方法使查询被发送到数据库进行检索,所以Find方法要异步执行
- 查

- pageData语句只是设置为一个查询语句,并没有执行,直到调用.ToList才会将数据从数据库中
查询并加载在内存中,所以ToList方法要异步执行
- 改

- FirstOrDefault方法返回的是序列的第一个元素或默认值,是向数据库中发起了请求,所以
该方法要异步执行
同步or异步
- 同步
- 操作简单或者能在短时间内执行完毕
- 简单性和可测试性
- 操作是CPU密集型,而非IO密集型
- 异步
- 阻塞的操作
- 一种可以让用户取消长时间运行的请求的机制
- 操作是IO密集型,而非CPU密集型
以上内容部分摘抄自《ASP.NET MVC 5》
代码GitHub地址
c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作的更多相关文章
- asp.net mvc异步查询
对于asp.net mvc异步查询 如何做MVC异步查询,做列表页面. 查询是项目中必不可少的工作,而且不同的项目不同的团队,都有自己的简单方法.Asp.net mvc 有自己独特的优势,下面是结合m ...
- ASP.NET MVC异步验证是如何工作的03,jquery.validate.unobtrusive.js是如何工作的
在上一篇"ASP.NET MVC异步验证是如何工作的02,异步验证表单元素的创建"中了解了ASP.NET异步验证是如何创建表单元素的,本篇体验jquery.validate.uno ...
- ASP.NET MVC异步验证是如何工作的02,异步验证表单元素的创建
在上一篇"ASP.NET MVC异步验证是如何工作的01,jQuery的验证方式.错误信息提示.validate方法的背后"中,了解了jQuery如何验证,如何显示错误信息,本篇要 ...
- ASP.NET MVC异步验证是如何工作的01,jQuery的验证方式、错误信息提示、validate方法的背后
ASP.NET MVC借助jQuery的验证机制,提供了一套从客户端到服务端异步验证的解决方案,通常情况下,用起来相当方便.但面对一些相对特殊的情况,可能会遇到验证失效的场景,比如在使用ajax动态异 ...
- C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(上)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# ...
- 温故知新,CSharp遇见异步编程(Async/Await),聊聊异步编程最佳做法
什么是异步编程(Async/Await) Async/Await本质上是通过编译器实现的语法糖,它让我们能够轻松的写出简洁.易懂.易维护的异步代码. Async/Await是C# 5引入的关键字,用以 ...
- 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理
第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实现方式,创建数据访问层和数据入口,处理Post数据,以及数据验证等功能. 系列文章 七天学会ASP.NET M ...
- C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)),不对的地方欢迎指出与交流. 章节出自<Professional C# ...
- 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理 【转】
http://www.cnblogs.com/powertoolsteam/p/MVC_three.html 第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实 ...
随机推荐
- P1823 [COI2007] Patrik 音乐会的等待 单调栈 洛谷luogu
题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. ...
- DIYer最担心的事来了!CPU降价彻底无望
12月27日,IDC发布2019年中国PC市场十大预测.IDC指出,2018年全年中国PC市场预计最终销售为5200万台左右,下滑了3.4%.2019年中国PC市场会处于一种习惯性艰难期,但是市场也不 ...
- python基础学习第三天
#变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间#基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中#变量可以指定不同的数据类型,这些变量可以存储整数.小数 ...
- D. Imbalanced Array
让你计算所有连续子序列的最大值-最小值的和. (单调栈) 对于一个数Ai来讲,如果其有贡献的价值,要么是-Ai作为最小值,要么是Ai作为最大值. 那么Ans=ΣAi*maxn-Ai*minn. voi ...
- 监控虚拟机跟外部的tcp连接
1.监控虚拟机跟外部的tcp连接,如果连接数超过阈值,就在FORWARD把ip DROP ,并且发送邮件 root@InternetGateway:~# cat /root/scripts/check ...
- Webpack 概念
概念 webpack 是一个现代的 JavaScript 应用程序的模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依赖关系图表(dependency ...
- 把一个List<T>的数据复制至另一个List<T>
把一个数据集List<T>复制至到另一个数据集List<T>. 方法一,可以使用循环,然后把每一个T添加至另一个集合中去: public void ListDemo() { , ...
- C# 泛型分组和Linq分组的异同
没什么好说的,因为用的到,所以作个记录, 代码如下: using System; using System.Collections.Generic; using System.Linq; using ...
- 自己动手写把”锁”---LockSupport深入浅出
本篇是<自己动手写把"锁">系列技术铺垫的最后一个知识点.本篇主要讲解LockSupport工具类,它用来实现线程的挂起和唤醒. LockSupport是Java6引入 ...
- CentOS6下OpenLDAP+PhpLdapAdmin基本安装及主从/主主高可用模式部署记录
下面测试的部署机ip地址为:192.168.10.2051)yum安装OpenLDAP [root@openldap-server ~]# yum install openldap openldap- ...