Учебники

Entity Framework — Асинхронный запрос

Асинхронное программирование включает выполнение операций в фоновом режиме, чтобы основной поток мог продолжать свои собственные операции. Таким образом, основной поток может поддерживать отзывчивость пользовательского интерфейса, пока фоновый поток обрабатывает задачу под рукой.

  • 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 завершается.

Извлекает всех учеников из базы данных и записывает в консоль.

Мы рекомендуем вам выполнить вышеприведенный пример пошагово для лучшего понимания.