异步编程涉及在后台执行操作,以便主线程可以继续自己的操作.这样主线程可以在后台线程处理手头的任务时保持用户界面的响应.
实体框架6.0支持异步操作以查询和保存数据.
异步操作可以通过以下方式帮助您的应用程序 :
让您的应用程序更好地响应用户交互
提高应用程序的整体性能
您可以通过各种方式执行异步操作.但是在.NET Framework 4.5中引入了异步/等待关键字,这使得您的工作变得简单.
您唯一需要遵循的是异步/等待模式由以下代码片段说明.
让我们看一下DatabaseOperations方法保存的以下示例(不使用async/await)一个新学生到数据库,然后从数据库中检索所有学生,最后在控制台上打印一些额外的消息.
class Program { static void Main(string[] args) { Console.WriteLine("Database Operations Started"); DatabaseOperations(); Console.WriteLine(); Console.WriteLine("Database Operations Completed"); Console.WriteLine(); Console.WriteLine("Entity Framework Tutorials"); Console.ReadKey(); } public static void DatabaseOperations() { using (var context = new UniContextEntities()) { // Create a new student and save it context.Students.Add(new Student { FirstMidName = "Akram", LastName = "Khan", EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())}); Console.WriteLine("Calling SaveChanges."); context.SaveChanges(); Console.WriteLine("SaveChanges completed."); // Query for all Students ordered by first name var students = (from s in context.Students orderby s.FirstMidName select s).ToList(); // Write all students out to Console Console.WriteLine(); Console.WriteLine("All Student:"); foreach (var student in students) { string name = student.FirstMidName + " " + student.LastName; Console.WriteLine(" " + name); } } } }
执行上述代码后,您将收到以下内容输出 :
Calling SaveChanges. SaveChanges completed. All Student: Akram Khan Ali Khan Ali Alexander Arturo Anand Bill Gates Gytis Barzdukas Laura Nornan Meredith fllonso Nino Olioetto Peggy Justice Yan Li Entity Framework Tutorials
让我们使用新的async和await关键字并对Program.cs进行以下更改
添加System.Data.实体命名空间,它将提供EF异步扩展方法.
添加System.Threading.Tasks命名空间,这将允许我们使用任务类型.
更新 DatabaseOperations 以标记为 async 并返回任务.
调用SaveChanges的异步版本并等待其完成.
调用ToList的Async版本和等待结果.
class Program { static void Main(string[] args) { var task = DatabaseOperations(); Console.WriteLine(); Console.WriteLine("Entity Framework Tutorials"); task.Wait(); Console.ReadKey(); } public static async Task DatabaseOperations() { using (var context = new UniContextEntities()) { // Create a new blog and save it context.Students.Add(new Student { FirstMidName = "Salman", LastName = "Khan", EnrollmentDate = DateTime.Parse(DateTime.Today.ToString())}); Console.WriteLine("Calling SaveChanges."); await context.SaveChangesAsync(); Console.WriteLine("SaveChanges completed."); // Query for all Students ordered by first name var students = await (from s in context.Students orderby s.FirstMidName select s).ToListAsync(); // Write all students out to Console Console.WriteLine(); Console.WriteLine("All Student:"); foreach (var student in students) { string name = student.FirstMidName + " " + student.LastName; Console.WriteLine(" " + name); } } } }
执行时,它将产生以下输出.
Calling SaveChanges. Entity Framework Tutorials SaveChanges completed. All Student: Akram Khan Ali Khan Ali Alexander Arturo Anand Bill Gates Gytis Barzdukas Laura Nornan Meredith fllonso Nino Olioetto Peggy Justice Salman Khan Yan Li
现在,代码是异步的,您可以观察程序的不同执行流程.
SaveChanges开始将新学生推送到数据库然后DatabaseOperations方法返回(即使它还没有完成执行),Main方法中的程序流继续.
然后将消息写入console.
在Wait调用中阻止托管线程,直到数据库操作完成.一旦完成,我们将继续执行DatabaseOperations的剩余部分.
SaveChanges完成.
从数据库中检索所有学生并写入控制台.
我们建议您在一个步骤中执行上述示例为了更好地理解,逐步的方式.