Entity Framework - Asynchroniczne zapytanie

Asynchronous programmingpolega na wykonywaniu operacji w tle, aby główny wątek mógł kontynuować swoje własne operacje. W ten sposób główny wątek może utrzymywać responsywność interfejsu użytkownika, podczas gdy wątek w tle przetwarza zadanie.

  • Entity Framework 6.0 obsługuje operacje asynchroniczne do wykonywania zapytań i zapisywania danych.

  • Operacje asynchroniczne mogą pomóc Twojej aplikacji w następujący sposób -

    • Spraw, aby Twoja aplikacja była bardziej responsywna na interakcje użytkowników
    • Popraw ogólną wydajność swojej aplikacji
  • Operacje asynchroniczne można wykonywać na różne sposoby. Jednak słowa kluczowe async / await zostały wprowadzone w .NET Framework 4.5, co upraszcza pracę.

  • Jedyną rzeczą, którą musisz przestrzegać, jest wzorzec async / await, jak ilustruje poniższy fragment kodu.

Przyjrzyjmy się poniższemu przykładowi (bez użycia async / await), w którym metoda DatabaseOperations zapisuje nowego ucznia do bazy danych, a następnie pobiera wszystkich studentów z bazy, a na koniec na konsoli wypisywany jest dodatkowy komunikat.

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);
         }
      }
   }
}

Po wykonaniu powyższego kodu otrzymasz następujący wynik -

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

Użyjmy nowych słów kluczowych async i await i wprowadźmy następujące zmiany w Program.cs

  • Dodaj przestrzeń nazw System.Data.Entity, która zapewni EF asynchroniczne metody rozszerzenia.

  • Dodaj przestrzeń nazw System.Threading.Tasks, która pozwoli nam użyć typu Task.

  • Aktualizacja DatabaseOperations być oznaczone jako async i zwróć plik Task.

  • Wywołaj wersję Async SaveChanges i poczekaj na jej zakończenie.

  • Wywołaj wersję Async narzędzia ToList i poczekaj na wynik.

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);
         }
      }
   }
}

Po wykonaniu wygeneruje następujący wynik.

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

Teraz, gdy kod jest asynchroniczny, możesz obserwować inny przepływ wykonywania programu.

  • SaveChanges zaczyna wypychać nowego ucznia do bazy danych, a następnie metoda DatabaseOperations zwraca (nawet jeśli nie została zakończona), a przepływ programu w metodzie Main jest kontynuowany.

  • Wiadomość jest następnie zapisywana na konsoli.

  • Zarządzany wątek jest blokowany w wywołaniu Wait do zakończenia operacji bazy danych. Po zakończeniu pozostała część naszych operacji bazy danych zostanie wykonana.

  • SaveChanges zakończyło się.

  • Pobrano wszystkich uczniów z bazy danych i zapisano w konsoli.

Zalecamy wykonanie powyższego przykładu krok po kroku w celu lepszego zrozumienia.