Entity Framework - асинхронный запрос
Asynchronous programmingвключает выполнение операций в фоновом режиме, чтобы основной поток мог продолжать свои собственные операции. Таким образом, основной поток может поддерживать отклик пользовательского интерфейса, пока фоновый поток обрабатывает текущую задачу.
Entity Framework 6.0 поддерживает асинхронные операции для запроса и сохранения данных.
Асинхронные операции могут помочь вашему приложению следующими способами:
- Сделайте ваше приложение более отзывчивым на взаимодействие с пользователем
- Повысьте общую производительность вашего приложения
Вы можете выполнять асинхронные операции разными способами. Но ключевые слова async / await были введены в .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 async.
Добавьте пространство имен System.Threading.Tasks, которое позволит нам использовать тип Task.
Обновить DatabaseOperations быть отмеченным как async и вернуть Task.
Вызовите асинхронную версию SaveChanges и дождитесь ее завершения.
Вызовите Async-версию ToList и дождитесь результата.
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 продолжается.
Затем сообщение записывается в консоль.
Управляемый поток блокируется при вызове Wait, пока не завершится операция с базой данных. После его завершения будут выполнены остальные наши операции с базой данных.
SaveChanges завершается.
Извлечены все ученики из базы данных и записаны в Консоль.
Мы рекомендуем вам выполнить приведенный выше пример поэтапно для лучшего понимания.