ASP.NET MVC 异步控制器及EF异步操作

异步控制器

  • ASP.NET MVC2后开始了对异步请求管道的支持,异步请求管道的作用是允许web服务器处理长时间运行的请求,比如

    那些花费大量时间等待网络或数据库操作完成的请求仍能保持对其他请求的响应;所以异步主要是高效率而不是提高一个

    单独请求的响应速度,尽管异步花费了与同步一样的事件响应用户请求,但在异步管道中,服务器不会因为在等待一个请求

    的完成而阻塞其他有用的任务执行
  1. 理解异步和同步ASP.NET代码的区别
  • 首先理解web服务器是如何处理请求的。IIS维护了一个用来服务请求的空闲线程的集合(线程池)。当一个请求进入时,

    线程池中的一个线程就别调度用来处理进入的请求。当一个线程正在处理一个请求时,他就不能用来处理其他的请求,直到他

    完成第一个请求的处理。IIS同时服务多个请求的能力是基于一个假设:线程池中有空闲的线程来处理进入的请求
  1. 阻塞线程
  • 线程正在等待网络调用完成,因此不能用来执行当前请求的其他任务
  1. 线程饥饿
  • 只要线程池足够大的话,阻塞线程并不是什么大问题;然而在处理多个并发请求的大型应用程序中,可能会因为请求的数量过多而导致

    等待数据的请求也多而阻塞了大量的线程,从而导致线程池没有足够的空闲线程来处理新的请求
  1. 语法

public async Task&ltActionResult&gt 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异步

  1. 同步
  • 操作简单或者能在短时间内执行完毕
  • 简单性和可测试性
  • 操作是CPU密集型,而非IO密集型
  1. 异步
  • 阻塞的操作
  • 一种可以让用户取消长时间运行的请求的机制
  • 操作是IO密集型,而非CPU密集型

以上内容部分摘抄自《ASP.NET MVC 5》

代码GitHub地址

c#异步编程(三)—ASP.NET MVC 异步控制器及EF异步操作的更多相关文章

  1. asp.net mvc异步查询

    对于asp.net mvc异步查询 如何做MVC异步查询,做列表页面. 查询是项目中必不可少的工作,而且不同的项目不同的团队,都有自己的简单方法.Asp.net mvc 有自己独特的优势,下面是结合m ...

  2. ASP.NET MVC异步验证是如何工作的03,jquery.validate.unobtrusive.js是如何工作的

    在上一篇"ASP.NET MVC异步验证是如何工作的02,异步验证表单元素的创建"中了解了ASP.NET异步验证是如何创建表单元素的,本篇体验jquery.validate.uno ...

  3. ASP.NET MVC异步验证是如何工作的02,异步验证表单元素的创建

    在上一篇"ASP.NET MVC异步验证是如何工作的01,jQuery的验证方式.错误信息提示.validate方法的背后"中,了解了jQuery如何验证,如何显示错误信息,本篇要 ...

  4. ASP.NET MVC异步验证是如何工作的01,jQuery的验证方式、错误信息提示、validate方法的背后

    ASP.NET MVC借助jQuery的验证机制,提供了一套从客户端到服务端异步验证的解决方案,通常情况下,用起来相当方便.但面对一些相对特殊的情况,可能会遇到验证失效的场景,比如在使用ajax动态异 ...

  5. C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(上)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# ...

  6. 温故知新,CSharp遇见异步编程(Async/Await),聊聊异步编程最佳做法

    什么是异步编程(Async/Await) Async/Await本质上是通过编译器实现的语法糖,它让我们能够轻松的写出简洁.易懂.易维护的异步代码. Async/Await是C# 5引入的关键字,用以 ...

  7. 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理

    第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实现方式,创建数据访问层和数据入口,处理Post数据,以及数据验证等功能. 系列文章 七天学会ASP.NET M ...

  8. C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)),不对的地方欢迎指出与交流. 章节出自<Professional C# ...

  9. 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理 【转】

    http://www.cnblogs.com/powertoolsteam/p/MVC_three.html 第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实 ...

随机推荐

  1. AMD和CMD规范

    1.名词解释AMD:Asynchronous Modules Definition异步模块定义,提供定义模块及异步加载该模块依赖的机制.CMD:Common Module Definition 通用模 ...

  2. MySQL 基础七 视图

    -- 查看表 SELECT * FROM student; SHOW CREATE TABLE student; -- 创建视图 CREATE VIEW v_student1 AS SELECT *F ...

  3. linux下的C语言程序设计

    Linux程序设计基础知识 Linux下C语言编程环境概述 Linux下C语言编程常用的编辑器是vim或emacs,编译器一般用gcc,编译链接程序用make,跟踪调试一般使用gdb,项目管理用mak ...

  4. RabbitMq、ActiveMq、ZeroMq、kafka之间的比较

    MQ框架非常之多,比较流行的有RabbitMq.ActiveMq.ZeroMq.kafka.这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求.下面我列出这些MQ之间的对比数据和资料. 第一部 ...

  5. Lauterbach TRACE32技巧小集

    1. TRACE32中实现类container_of功能 假设现在我只知道一个全局变量成员tv2的地址,类型是tvec_base.我想知道这个全局变量的地址怎么办? struct tvec_base ...

  6. BP浅谈

    之前一直对BP的理解不透彻,这可不行,这个可是超经典的广泛应用在ML中的求偏导的方法.本博来自<神经网络与机器学习>P86页. 在用到bp的地方我们都是为了使用梯度下降法,并求出他的偏导数 ...

  7. ASP.NET MVC学习笔记(一) 从路由开始创建mvc

    之前一篇写一半发现版本太老了,是基于mvc2的. 两本参考书编写的顺序各方面都不太一样.决定重新写一篇. 我这篇文章基于mvc5,vs2015 参考书:Will保哥的ASP.NET MVC4开发指南 ...

  8. python---pandas.merge使用

    merge 函数参数 ”’ merge: 合并数据集, 通过left, right确定连接字段,默认是两个数据集相同的字段 参数 说明 left 参与合并的左侧DataFrame right 参与合并 ...

  9. BZOJ4816 SDOI2017 数字表格 莫比乌斯反演

    传送门 做莫比乌斯反演题显著提高了我的\(\LaTeX\)水平 推式子(默认\(N \leq M\),分数下取整,会省略大部分过程) \(\begin{align*} \prod\limits_{i= ...

  10. BootStrap学习(3)_导航菜单

    一.导航元素 1.表格导航或标签 以一个带有 class .nav 的无序列表开始. 添加 class .nav-tabs. <!DOCTYPE html> <html xmlns= ...