这个特性从EF6开始,在之前的版本中不存在.
EF6(.net 4.5)开始支持用async和await关键字进行异步查询和保存,不是所有的程序都能从异步中得到好处,当被挂起长时间的运行,网络或IO-bound任务,可以被用于提高客户端的响应和服务端的扩展,
什么时侯适合使用asyn
创建model
创建异步程序
让程序异步
结论
什么时侯适合使用asyn
这篇文章的目的是用一种方式介绍asyn概念,让它很容易被观察到异步和同步程序之间的区别,这个演练不关注异步编程带来好处的任何场景。
异步操作通常用于执行完成时间可能较长的任务,如打开大文件、连接远程计算机或查询数据库。异步操作在主应用程序线程以外的线程中执行。应用程序调用方法异步执行某个操作时,应用程序可在异步方法执行其任务时继续执行。
在客户端程序(WinForm, WPF等)中,在当前的线程执行时异步操作可用于保持UI的响应。在服务端程序中(ASP.NET等)异步线程可以被用于处理其它未来的请求 - 这是可以减少内存的使用量或增加服务器的吞吐量。
在多数的程序中使用异步没有明显的好处,甚至是有害的。使用测试,分析和通用场景来测量在你的特定的情况下的影响。
Create the model
创建控制台程序AsyncDemo
添加EntityFramework Nuget package
安装EntityFramework package
创建Model - AsyncDemo.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; } } }
创建一个异步程序
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() + 1) }); 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到数据库并且获取所有的Blogs然后打印在控制台中。
修改为异步
//添加Tasks引用 using System.Data.Entity; using System.Threading.Tasks; 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() + 1) }); 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); } } }
原文:https://msdn.microsoft.com/en-us/data/jj819165.aspx
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。