这个特性从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:

usingSystem.Collections.Generic;usingSystem.Data.Entity;namespaceAsyncDemo{publicclassBloggingContext:DbContext{publicDbSet<Blog>Blogs{get;set;}publicDbSet<Post>Posts{get;set;}}publicclassBlog{publicintBlogId{get;set;}publicstringName{get;set;}publicvirtualList<Post>Posts{get;set;}}publicclassPost{publicintPostId{get;set;}publicstringTitle{get;set;}publicstringContent{get;set;}publicintBlogId{get;set;}publicvirtualBlogBlog{get;set;}}}


创建一个异步程序

classProgram{staticvoidMain(string[]args){PerformDatabaseOperations();Console.WriteLine();Console.WriteLine("Quoteoftheday");Console.WriteLine("Don'tworryabouttheworldcomingtoanendtoday...");Console.WriteLine("It'salreadytomorrowinAustralia.");Console.WriteLine();Console.WriteLine("Pressanykeytoexit...");Console.ReadKey();}publicstaticvoidPerformDatabaseOperations(){using(vardb=newBloggingContext()){//Createanewblogandsaveitdb.Blogs.Add(newBlog{Name="TestBlog#"+(db.Blogs.Count()+1)});db.SaveChanges();//Queryforallblogsorderedbynamevarblogs=(frombindb.Blogsorderbyb.Nameselectb).ToList();//WriteallblogsouttoConsoleConsole.WriteLine();Console.WriteLine("Allblogs:");foreach(varbloginblogs){Console.WriteLine(""+blog.Name);}}}}

PerformDatabaseOperations方法会保存一个新的Blog到数据库并且获取所有的Blogs然后打印在控制台中。


修改为异步

//添加Tasks引用usingSystem.Data.Entity;usingSystem.Threading.Tasks;staticvoidMain(string[]args){vartask=PerformDatabaseOperations();Console.WriteLine("Quoteoftheday");Console.WriteLine("Don'tworryabouttheworldcomingtoanendtoday...");Console.WriteLine("It'salreadytomorrowinAustralia.");task.Wait();Console.WriteLine();Console.WriteLine("Pressanykeytoexit...");Console.ReadKey();}publicstaticasyncTaskPerformDatabaseOperations(){using(vardb=newBloggingContext()){//Createanewblogandsaveitdb.Blogs.Add(newBlog{Name="TestBlog#"+(db.Blogs.Count()+1)});Console.WriteLine("CallingSaveChanges.");awaitdb.SaveChangesAsync();Console.WriteLine("SaveChangescompleted.");//QueryforallblogsorderedbynameConsole.WriteLine("Executingquery.");varblogs=await(frombindb.Blogsorderbyb.Nameselectb).ToListAsync();//WriteallblogsouttoConsoleConsole.WriteLine("Querycompletedwithfollowingresults:");foreach(varbloginblogs){Console.WriteLine("-"+blog.Name);}}}





原文:https://msdn.microsoft.com/en-us/data/jj819165.aspx