Why

在应用程序,尤其是互联网应用程序中,性能一直是很多大型网站的困扰,由于Web2.0时代的到来,人们更多的把应用程序从C/S结构迁移到B/S结构,这样会带来客户端轻量,部署、试试方便快捷等优势,但是万事万物都有他的两面性,这样的发展趋势同时也带来了其他方便的不好影响,其中很重要的一项就是系统对服务器的性能要求提高,随着用户量增多和系统功能的增加,服务器性能渐渐成了短板。

这种性能的影响,可以从诸多方面进行优化,比如使用负载均衡的服务器,建立服务器集群等方式,但是这是从硬件配置方面的优化,而在软件开发方面,同样也可以做很多性能方面的优化。

我们都知道,微软的IIS服务器中每个线程数量是有限的,在以往的ASP.NET MVC应用程序中,当一个请求到达服务器,IIS从线程池中创建一个线程开始执行调用,当执行完所有的操作将请求返回,再释放线程,也就是说整个调用过程中,线程是一只持有的。

可如果程序访问人数增加,线程就成了一种稀缺的资源,如果在一次请求中,需要访问远程数据库、或者进行大的IO处理,这是请求很可能就会长期的持有一个线程,而当用户量大这种长期请求多的时候,线程池就会迅速的被占满,请求进入等待队列,而且等待队列也是有最大长度的,同时还可能将请求超时返回给浏览器端。

所以,我们就会想需要一种异步的方式来执行请求,当遇到长请求的时候,将请求从IIS线程交由后台线程处理,释放当前线程,处理完成后,再从线程池中选择线程继续进行请求的其它处理。

How

在ASP.NET MVC3种,已经提供了AsyncController,可以创建异步的控制器,可那时候需要用到Async和Completed方法对的模式来处理,而现在,我们不需要单独去实现继承自AsyncController的类,只需要在原有Action方法上加上特定的关键字和返回类型,就可以创建异步的控制器。

而且,在Entity Framework6中,同样实现了对数据的异步查询和保存的功能,这就使得我们在应用程序整个过程中,都可以以异步的方式处理逻辑。

Let’s  do   it

示例使用VS2013创建一个ASP.NET MVC5项目”AsyncExample“(不纠结于设计原则,注意重点)

在Models文件夹中添加一个用户类:

namespace AsyncExample.Models
{
public class User
{
[Key]
public int Id { get; set; }
public string IdentityToken { get; set; }
public string Name { get; set; }
}
}

给项目添加Entity Framework的引用

PM> install-package entityframework

创建DbContext子类AsyncDbContext类:

namespace AsyncExample.Models
{
public class AsyncDbContext:DbContext
{
public DbSet<User> Users { get; set; } public AsyncDbContext()
: base("name=DefaultConnection")
{ }
}
}

更新Web.config,添加数据库连接串。

开启Entity framework的Migrations功能:

PM> enable-migrations

BTW:在新版本的Entity Framework中,已经可以使用自动迁移,不需要为每一次的模型变更手动的去升级数据库结构,打开的方法很简单:

打开Migrations文件夹下的Configuration.cs文件,在Configuration默认构造函数中可以看到一个AutomaticMigrationsEnabled属性被设置为False,改成True就可以自动迁移了,颤抖吧

数据库更新完之后,来创建一个控制器:

using System.Data.Entity;

namespace AsyncExample.Controllers
{
public class UserController : Controller
{
AsyncDbContext context = new AsyncDbContext(); public ActionResult Create()
{
return View();
} [HttpPost]
public async Task<ActionResult> Create(User user)
{
context.Users.Add(user);
await context.SaveChangesAsync();
return RedirectToAction("List");
} public async Task<ActionResult> List()
{
return View(await context.Users.ToListAsync());
}
}
}

可以看到在Create和List两个方法中,都使用了async和aswait创建了两个异步的方法,我们也只直接继承了Controller,因为现在的同步异步的功能都放在了这个类里,同时我们需要引入Systen.Data.Entity这个命名空间,其中包含了对IQueryable类型的ToListAsync扩展方法,增加了异步加载的功能。

最终呈现效果,摆图占地:

这篇就到这里了,其实这一系列的下一篇还没确定要写什么内容,希望博友基友好朋友们给点意见把。

如果您觉得这篇文章对您有用,劳烦给个赞!

如果您觉得这篇文章可能对别人游泳,劳烦您推荐一个!

如果您觉得这篇文章真扯淡,那么你又给我刷了个访问量!

探寻ASP.NET MVC鲜为人知的奥秘(2):与Entity Framework配合,让异步贯穿始终的更多相关文章

  1. 探寻ASP.NET MVC鲜为人知的奥秘(1):对LESS的支持

    在ASP.NET MVC3中(从那时开始),我们拥有了对js和css等文件的捆绑(Bundling)和压缩(Minification)的能力,这是ASP.NET性能优化工作的一部分. 想一下很久以前, ...

  2. 探寻ASP.NET MVC鲜为人知的奥秘(3):寻找多语言的最佳实践方式

    如果你的网站需要被世界各地的人访问,访问者会使用各种不同的语言和文字书写习惯,那么创建一个支持多语言的网站就是十分必要的了,这一篇文章就讲述怎么快速合理的创建网站对多语言的支持.接下来通过一个实例来讲 ...

  3. [ASP.NET MVC 小牛之路]06 - 使用 Entity Framework

    在家闲着也是闲着,继续写我的[ASP.NET MVC 小牛之路]系列吧.在该系列的上一篇博文中,在显示书本信息列表的时候,我们是在程序代码中手工造的数据.本文将演示如何在ASP.NET MVC中使用E ...

  4. 【ASP.NET MVC 学习笔记】- 07 使用 Entity Framework

    本文参考:http://www.cnblogs.com/willick/p/3304534.html 1.ORM(Object Relation Mapping)工具,是为了解决“关系数据库”和“面向 ...

  5. ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。

    一个简单的 ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript . 前言 TypeScript 是一种由微软开发的自由和开源的编程语言.它是JavaS ...

  6. ASP.NET: Setup a MVC5 website with MySQL, Entity Framework 6 Code-First and VS2013

    The new features available in EF6 allow any developer to build a simple DB-powered website with very ...

  7. ASP.NET Core 快速入门(Razor Pages + Entity Framework Core)

    引子 自从 2009 年开始在博客园写文章,这是目前我写的最长的一篇文章了. 前前后后,我总共花了 5 天的时间,每天超过 3 小时不间断写作和代码调试.总共有 8 篇文章,每篇 5~6 个小结,总截 ...

  8. ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.

    在ASP.Net Core 2.0的项目里, 我使用Entity Framework Core 2.0 作为ORM. 有人习惯把数据库的连接字符串写在appSettings.json里面, 有的习惯写 ...

  9. 一个简单的 ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。

    前言 TypeScript 是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架 ...

随机推荐

  1. 2456. mode【乱搞】

    Description 给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数. Input 第1行一个正整数n. 第2行n个正整数用空格隔开. Output 一行一个正整数 ...

  2. JAVA项目服务器部署

    1.下载 Java JDK 搜索jdk下载,然后进入JAVA官方网站jdk下载页,选择自己的对应的操作系统,点击下载 https://www.oracle.com/technetwork/java/j ...

  3. 闲来无事做了一个项目,内有redis,EasyUI样式简单应用,七层分页查询,API跨域。

    <link href="~/jquery-easyui-1.5.3/themes/default/easyui.css" rel="stylesheet" ...

  4. C++练习 | 求解二叉树的高度

    int h(BTree *bt) { if(bt->lchild==NULL&&bt->rchild==NULL) ; if(bt->lchild!=NULL& ...

  5. 19-3-13Python中的函数

    def:关键字.定义.声明一个函数. def make():定义函数'make' *注:定义后的函数不调用是不执行的 函数的调用: 函数名+()==函数的调用 def addnum(): a = in ...

  6. mac 下安装php7.1 redis

    1.下载phpredis源文件 https://nodeload.github.com/nicolasff/phpredis/zip/master 下载后解压 2.执行命令 phpize  执行后执行 ...

  7. linux静态IP最简配置

    vi /etc/sysconfig/network-scripts/ifcfg-xxx TYPE="Ethernet"BOOTPROTO="static"ONB ...

  8. C# 数组集合分页 Skip Take

    var input=new input(); var personList= new List<Person>(); //一个查询集合 var Total = personList.Cou ...

  9. 前端解析zip文件

    使用jszip.js,read.js. 传入fileinput选中的文件对象 function handleFile(f) { JSZip.loadAsync(f) .then(function(zi ...

  10. 写 5 个你知道的 HTML5 标签,说明他们的意义

    1:<canvas>标签   定义图形.图像,是基于javascript的绘图API 2:<video>标签   定义视频 3:<audio>标签  定义音频内容 ...