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