📅  最后修改于: 2020-11-21 07:24:43             🧑  作者: Mango
异步编程涉及在后台执行操作,以便主线程可以继续其自己的操作。这样,主线程可以在后台线程处理手头任务时使用户界面保持响应。
Entity Framework 6.0支持用于查询和保存数据的异步操作。
异步操作可以通过以下方式帮助您的应用程序-
您可以通过多种方式执行异步操作。但是.NET Framework 4.5中引入了async / await关键字,这使您的工作变得简单。
您需要遵循的唯一方法是异步/等待模式,如以下代码片段所示。
让我们看下面的示例(不使用async / await),其中DatabaseOperations方法将新学生保存到数据库,然后从数据库中检索所有学生,最后在控制台上打印了一些其他消息。
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.Entity命名空间,它将提供EF异步扩展方法。
添加System.Threading.Tasks命名空间,这将允许我们使用Task类型。
更新DatabaseOperations以将其标记为异步并返回Task 。
调用SaveChanges的Async版本并等待其完成。
调用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开始将新的Student推送到数据库,然后DatabaseOperations方法返回(即使尚未完成执行),并且Main方法中的程序流程继续。
然后将消息写入控制台。
在数据库调用完成之前,等待线程将阻止受管线程。完成后,将执行其余的DatabaseOperations。
SaveChanges完成。
从数据库中检索所有学生,并将其写入控制台。
我们建议您逐步执行上述示例,以更好地理解。