原文:http://www.entityframeworktutorial.net/entityframework6/async-query-and-save.aspx
你可以在.NET4.5下使用 EF6 DbContext异步执行查询和命令。
我们来看看如何先执行异步查询,然后再看对context.SaveChanges的异步调用。
异步查询
private static async Task<Student> GetStudent() { Student myStudent = null; using (var context = new SchoolDBEntities()) { Console.WriteLine("Start GetStudent..."); myStudent = await (context.Students.Where(s => s.StudentID == 1).FirstOrDefaultAsync<Student>()); Console.WriteLine("Finished GetStudent..."); } return student; }
上面的代码所示,GetStudent方法使用async关键字标识使其异步。
异步方法的返回类型必须为Task。
GetStudent返回一个Student实体的对象,所以返回类型必须是Task <Student>。
此外,查询标记为await。 这将释放调用线程以执行其他操作,直到它执行查询并返回数据。
我们使用了System.Data.Entity的FirstOrDefaultAsync扩展方法,你也可以适当使用其他扩展方法,例如SingleOrDefaultAsync,ToListAsyn等。
异步保存
可以和上面示例一样的方式异步调用context.SaveChanges:
private static async Task SaveStudent(Student editedStudent) { using (var context = new SchoolDBEntities()) { context.Entry(editedStudent).State = EntityState.Modified; Console.WriteLine("Start SaveStudent..."); int x = await (context.SaveChangesAsync()); Console.WriteLine("Finished SaveStudent..."); } }
获取异步查询的结果
异步时可以使用wait方法得到结果,如下:
public static void AsyncQueryAndSave() { var queryResult = GetStudent(); Console.WriteLine("Let's do something else till we get student.."); queryResult.Wait(); var student1 = queryResult.Result; student1.FirstName = "Modified First Name"; var studentSave = SaveStudent(student1); Console.WriteLine("Let's do something else till we save student.." ); studentSave.Wait(); }
如上面的代码所示,我们以普通的方式调用Async方法GetStudent,并将引用存储在变量学生中。
然后,我们调用student.wait()。
这意味着调用线程应该等待直到异步方法完成,所以我们可以执行另一个进程,直到我们从异步方法得到结果。
上面显示的代码将具有以下输出: