EF6开始提供了通过async和await关键字实现异步查询和保存的支持(.net 4.5及更高版本)。虽然不是所有的操作都能从异步中获益,但是耗时的操作、网络或IO密集型任务中,使用异步可以提升客户端性能和增强服务器的扩展性。

本文将覆盖一下主题:

  • 实例演练异步操作
  • 创建模型
  • 创建同步程序
  • 改为异步操作

实例演练异步操作

下面演练将通过对比,很容易的观察异步操作和同步操作,该演练目的不是说明何时才是异步操作的关键场景。

创建模型

下面使用CodeFirst的流程创建模型并生成数据库,不过异步方法可以很好的工作于所有EF模型,包括EF设计器生成的模型。

创建一个控制台应用程序AsyncDemo。

添加EntityFramework NuGet包到项目中。

添加Model.cs到项目中,代码如下:

 1 using System.Collections.Generic;
 2 using System.Data.Entity;
 3
 4 namespace AsyncDemo
 5 {
 6     public class BloggingContext : DbContext
 7     {
 8         public DbSet<Blog> Blogs { get; set; }
 9         public DbSet<Post> Posts { get; set; }
10     }
11
12     public class Blog
13     {
14         public int BlogId { get; set; }
15         public string Name { get; set; }
16
17         public virtual List<Post> Posts { get; set; }
18     }
19
20     public class Post
21     {
22         public int PostId { get; set; }
23         public string Title { get; set; }
24         public string Content { get; set; }
25
26         public int BlogId { get; set; }
27         public virtual Blog Blog { get; set; }
28     }
29 }

创建同步程序

有了EF模型,下面通过代码模拟数据库存取。

 1 using System;
 2 using System.Linq;
 3
 4 namespace AsyncDemo
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             PerformDatabaseOperations();
11
12             Console.WriteLine();
13             Console.WriteLine("Quote of the day");
14             Console.WriteLine(" Don't worry about the world coming to an end today... ");
15             Console.WriteLine(" It's already tomorrow in Australia.");
16
17             Console.WriteLine();
18             Console.WriteLine("Press any key to exit...");
19             Console.ReadKey();
20         }
21
22         public static void PerformDatabaseOperations()
23         {
24             using (var db = new BloggingContext())
25             {
26                 // Create a new blog and save it
27                 db.Blogs.Add(new Blog
28                 {
29                     Name = "Test Blog #" + (db.Blogs.Count() + 1)
30                 });
31                 db.SaveChanges();
32
33                 // Query for all blogs ordered by name
34                 var blogs = (from b in db.Blogs
35                             orderby b.Name
36                             select b).ToList();
37
38                 // Write all blogs out to Console
39                 Console.WriteLine();
40                 Console.WriteLine("All blogs:");
41                 foreach (var blog in blogs)
42                 {
43                     Console.WriteLine(" " + blog.Name);
44                 }
45             }
46         }
47     }
48 }

上面代码通过调用PerformDatabaseOperations() 保存一个Blog对象到数据库中,然后从数据库中检索所有Blog,并显示到控制台,然后显示一行文本”Quote of the day“。

由于上面程序是同步执行的,所有可以观察到程序按下面流程执行:

  1. SaveChanges保存Blog对象到数据库中。
  2. SaveChanges完成。
  3. 发送查询Blog请求到数据库。
  4. 查询返回结果,并写入控制台。
  5. 显示文本“Quote of the day”到控制台。

改造为异步操作

对上面程序加以修改,使用async和await关键字实现异步操作。

 1 using System;
 2 using System.Data.Entity;
 3 using System.Linq;
 4 using System.Threading.Tasks;
 5
 6 namespace AsyncDemo
 7 {
 8     class Program
 9     {
10         static void Main(string[] args)
11         {
12             var task = PerformDatabaseOperations();
13
14             Console.WriteLine("Quote of the day");
15             Console.WriteLine(" Don't worry about the world coming to an end today... ");
16             Console.WriteLine(" It's already tomorrow in Australia.");
17
18             task.Wait();
19
20             Console.WriteLine();
21             Console.WriteLine("Press any key to exit...");
22             Console.ReadKey();
23         }
24
25         public static async Task PerformDatabaseOperations()
26         {
27             using (var db = new BloggingContext())
28             {
29                 // Create a new blog and save it
30                 db.Blogs.Add(new Blog
31                 {
32                     Name = "Test Blog #" + (db.Blogs.Count() + 1)
33                 });
34                 Console.WriteLine("Calling SaveChanges.");
35                 await db.SaveChangesAsync();
36                 Console.WriteLine("SaveChanges completed.");
37
38                 // Query for all blogs ordered by name
39                 Console.WriteLine("Executing query.");
40                 var blogs = await (from b in db.Blogs
41                             orderby b.Name
42                             select b).ToListAsync();
43
44                 // Write all blogs out to Console
45                 Console.WriteLine("Query completed with following results:");
46                 foreach (var blog in blogs)
47                 {
48                     Console.WriteLine(" - " + blog.Name);
49                 }
50             }
51         }
52     }
53 }

现在程序变为异步执行,可以观察到异步执行顺序为:

  1. 发送SaveChanges请求到数据库。
  2. 该请求发送给数据库时,当前线程不在占用CPU时间,从方法PerformDatabaseOperations中返回(虽然该方法还没有执行完成),控制权返回给主线程执行。
  3. 显示字符串“Quote of the day ”到控制台。
  4. SaveChanges完成。
  5. 发起查询Blogs请求到数据库。
  6. 查询完成返回结果,并显示到控制台。

转载于:https://www.cnblogs.com/from1991/p/5425263.html

Entity Framework异步查询和保存相关推荐

  1. 整理一下Entity Framework的查询

    Entity Framework是个好东西,虽然没有Hibernate功能强大,但使用更简便.今天整理一下常见SQL如何用EF来表达,Func形式和Linq形式都会列出来(本人更喜欢Func形式). ...

  2. (转)动态Entity Framework查询:Dynamic Query 介绍

    原文地址:http://www.cnblogs.com/yinzixin/archive/2012/11/30/entity-framework-dynamic-query.html Dynamic ...

  3. Entity Framework 简单增删改操作

    前言 在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作,现在主要来学习一下简单的增加.删除.修改操作. 增加 在EF中添加 ...

  4. Entity Framework 5.0基础系列

    1.Entity Framework简介 http://www.cnblogs.com/aehyok/p/3315991.html 2.Entity Framework DBFirst尝试http:/ ...

  5. Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)

    很久没有写博客了,一些读者也经常问问一些问题,不过最近我确实也很忙,除了处理日常工作外,平常主要的时间也花在了继续研究微软的实体框架(EntityFramework)方面了.这个实体框架加入了很多特性 ...

  6. 关于Entity Framework自动关联查询与自动关联更新导航属性对应的实体注意事项说明...

    一.首先了解下Entity Framework 自动关联查询: Entity Framework 自动关联查询,有三种方法:Lazy Loading(延迟加载),Eager Loading(预先加载) ...

  7. 【查询】—Entity Framework实例详解

    Entity Framework 查询使用集成查询,简称LINQ.LINQ是一个查询框架,并不限于Entity Framework使用,同样不限于数据库.LINQ Provider 负责将LINQ查询 ...

  8. 浅析Entity Framework Core2.0的日志记录与动态查询条件

    前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...

  9. Entity Framework 4.1/4.3 之五 (DBContext 之 2 查询功能)

    Entity Framework 4.1/4.3 之五 (DBContext 之 2 查询功能) 昨天我们讲了 DBContext的作用及它的一些相对于ObjectContext进行的优化,今天继续进 ...

最新文章

  1. C#写的NoSQL开源项目/系统(系列)
  2. java filestream 包,java.io.FileOutputStream.write(byte[] b)
  3. 队列表mysql,什么是在mysql中实现消息队列表的最佳方法
  4. EducationalCodeforcesRound62(Div. 2)(A-D题解)
  5. drools6.5_Drools 6.4.0.Final提供
  6. [html] 如何实现多行文字梯形排版?
  7. BFC 神奇背后的原理
  8. pytorch 如何使用cuda
  9. jprofiler_监控远程linux服务器的JVM进程(转 非常棒)
  10. ubuntu下从软件中心安装软件时的软件缓存目录
  11. DSA数字签名原理及python实现
  12. Linux中scp报 not a regular file错误解决方案
  13. 还搞不懂JVM?这一篇教你JVM从入门到入魔,全篇干货满满!
  14. 2008年9月3号,星期三,晴。日日行,不怕千万里;常常做,不怕千万事。 ——《格言联璧•处事》
  15. 前端面试题总结(js、html、小程序、React、ES6、Vue、全栈)
  16. 数据分析实战一:教育课程案例线上平台数据分析
  17. 既想吸猫又不想当猫奴?这款治愈系的机器人或许会适合你
  18. python之API接口调用
  19. Position 的四种属性值
  20. 基于Vue2.x的前端架构,我们是这么做的

热门文章

  1. C#--数据类型和类型转换
  2. 常用抓包工具(可编程抓包工具)
  3. windows中search driver的顺序
  4. 40张图彻底揭秘:输入网址究竟发生了什么?
  5. 太逗了,面试官让我讲线程 WAITING 状态!
  6. 如果我是一线技术主管……
  7. 在阿里干了五年,面试个小公司挂了…
  8. 6.OSI七层网络模型与TCP/IP四层网络模型
  9. 【Scratch】青少年蓝桥杯_每日一题_2.23_小猫来回走
  10. linux重定向进程输出到文件删除,Linux文件编辑器vim输出输入重定向、管道以及进程(示例代码)...