Entity Framework异步查询和保存
2024-08-28 15:01:41
EF6开始提供了通过async和await关键字实现异步查询和保存的支持(.net 4.5及更高版本)。虽然不是所有的操作都能从异步中获益,但是耗时的操作、网络或IO密集型任务中,使用异步可以提升客户端性能和增强服务器的扩展性。
本文将覆盖一下主题:
- 实例演练异步操作
- 创建模型
- 创建同步程序
- 改为异步操作
实例演练异步操作
下面演练将通过对比,很容易的观察异步操作和同步操作,该演练目的不是说明何时才是异步操作的关键场景。
创建模型
下面使用CodeFirst的流程创建模型并生成数据库,不过异步方法可以很好的工作于所有EF模型,包括EF设计器生成的模型。
创建一个控制台应用程序AsyncDemo。
添加EntityFramework NuGet包到项目中。
添加Model.cs到项目中,代码如下:
using System.Collections.Generic;
using System.Data.Entity; namespace AsyncDemo
{
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
} public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; } public virtual List<Post> Posts { get; set; }
} public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; } public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
}
创建同步程序
有了EF模型,下面通过代码模拟数据库存取。
using System;
using System.Linq; namespace AsyncDemo
{
class Program
{
static void Main(string[] args)
{
PerformDatabaseOperations(); Console.WriteLine();
Console.WriteLine("Quote of the day");
Console.WriteLine(" Don't worry about the world coming to an end today... ");
Console.WriteLine(" It's already tomorrow in Australia."); Console.WriteLine();
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
} public static void PerformDatabaseOperations()
{
using (var db = new BloggingContext())
{
// Create a new blog and save it
db.Blogs.Add(new Blog
{
Name = "Test Blog #" + (db.Blogs.Count() + )
});
db.SaveChanges(); // Query for all blogs ordered by name
var blogs = (from b in db.Blogs
orderby b.Name
select b).ToList(); // Write all blogs out to Console
Console.WriteLine();
Console.WriteLine("All blogs:");
foreach (var blog in blogs)
{
Console.WriteLine(" " + blog.Name);
}
}
}
}
}
上面代码通过调用PerformDatabaseOperations() 保存一个Blog对象到数据库中,然后从数据库中检索所有Blog,并显示到控制台,然后显示一行文本”Quote of the day“。
由于上面程序是同步执行的,所有可以观察到程序按下面流程执行:
- SaveChanges保存Blog对象到数据库中。
- SaveChanges完成。
- 发送查询Blog请求到数据库。
- 查询返回结果,并写入控制台。
- 显示文本“Quote of the day”到控制台。
改造为异步操作
对上面程序加以修改,使用async和await关键字实现异步操作。
using System;
using System.Data.Entity;
using System.Linq;
using System.Threading.Tasks; namespace AsyncDemo
{
class Program
{
static void Main(string[] args)
{
var task = PerformDatabaseOperations(); Console.WriteLine("Quote of the day");
Console.WriteLine(" Don't worry about the world coming to an end today... ");
Console.WriteLine(" It's already tomorrow in Australia."); task.Wait(); Console.WriteLine();
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
} public static async Task PerformDatabaseOperations()
{
using (var db = new BloggingContext())
{
// Create a new blog and save it
db.Blogs.Add(new Blog
{
Name = "Test Blog #" + (db.Blogs.Count() + )
});
Console.WriteLine("Calling SaveChanges.");
await db.SaveChangesAsync();
Console.WriteLine("SaveChanges completed."); // Query for all blogs ordered by name
Console.WriteLine("Executing query.");
var blogs = await (from b in db.Blogs
orderby b.Name
select b).ToListAsync(); // Write all blogs out to Console
Console.WriteLine("Query completed with following results:");
foreach (var blog in blogs)
{
Console.WriteLine(" - " + blog.Name);
}
}
}
}
}
现在程序变为异步执行,可以观察到异步执行顺序为:
- 发送SaveChanges请求到数据库。
- 该请求发送给数据库时,当前线程不在占用CPU时间,从方法PerformDatabaseOperations中返回(虽然该方法还没有执行完成),控制权返回给主线程执行。
- 显示字符串“Quote of the day ”到控制台。
- SaveChanges完成。
- 发起查询Blogs请求到数据库。
- 查询完成返回结果,并显示到控制台。
最新文章
- WCF入门教程(四)通过Host代码方式来承载服务
- TweenMax参数说明
- CSS中强大的EM
- Amazon的Fire Phone之于Android开发者
- bzoj 1228: [SDOI2009]E&;D 阿达马矩阵
- Python(2.7.6) copy - 浅拷贝与深拷贝
- 「C」 函数、运算、流程控制
- 第m个全排列
- SilkTest高级进阶系列10 – bitmap工具bitview
- html的URL参数传值问题
- 面向接口编程详解-Java篇
- MySQL--如何快速对比数据
- Android 自定义 View 绘制
- Linux shell基础知识(上)
- Spark资源配置(核数与内存)
- Markdown 链接
- canvas移动端兼容性问题总结
- 关于openwrt使用web升级提示固件版本不对的处理方法
- CSS属性之word-break:break-all强制性换行
- mysql命令补全工具