Entity Framework - Requête asynchrone

Asynchronous programmingimplique l'exécution d'opérations en arrière-plan afin que le thread principal puisse continuer ses propres opérations. De cette façon, le thread principal peut garder l'interface utilisateur réactive pendant que le thread d'arrière-plan traite la tâche en cours.

  • Entity Framework 6.0 prend en charge les opérations asynchrones pour l'interrogation et l'enregistrement des données.

  • Les opérations asynchrones peuvent aider votre application des manières suivantes:

    • Rendez votre application plus réactive aux interactions des utilisateurs
    • Améliorez les performances globales de votre application
  • Vous pouvez exécuter des opérations asynchrones de différentes manières. Mais les mots clés async / await ont été introduits dans .NET Framework 4.5, ce qui simplifie votre travail.

  • La seule chose que vous devez suivre est le modèle async / await comme illustré par le fragment de code suivant.

Jetons un coup d'œil à l'exemple suivant (sans utiliser async / await) dans lequel la méthode DatabaseOperations enregistre un nouvel étudiant dans la base de données, puis récupère tous les étudiants de la base de données et à la fin, un message supplémentaire est imprimé sur la console.

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

Lorsque le code ci-dessus est exécuté, vous recevrez la sortie suivante -

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

Utilisons les nouveaux mots clés async et await et apportons les modifications suivantes à Program.cs

  • Ajoutez l'espace de noms System.Data.Entity qui donnera les méthodes d'extension asynchrone EF.

  • Ajoutez l'espace de noms System.Threading.Tasks qui nous permettra d'utiliser le type de tâche.

  • Mettre à jour DatabaseOperations être marqué comme async et renvoyer un Task.

  • Appelez la version Async de SaveChanges et attendez son achèvement.

  • Appelez la version Async de ToList et attendez le résultat.

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

Lors de l'exécution, il produira la sortie suivante.

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

Maintenant que le code est asynchrone, vous pouvez observer un flux d'exécution différent de votre programme.

  • SaveChanges commence à pousser le nouvel étudiant vers la base de données, puis la méthode DatabaseOperations retourne (même si elle n'a pas fini de s'exécuter) et le déroulement du programme dans la méthode Main continue.

  • Le message est ensuite écrit sur la console.

  • Le thread géré est bloqué lors de l'appel Attendre jusqu'à la fin de l'opération de base de données. Une fois terminé, le reste de nos opérations de base de données sera exécuté.

  • SaveChanges se termine.

  • Récupéré tous les étudiants de la base de données et est écrit dans la console.

Nous vous recommandons d'exécuter l'exemple ci-dessus étape par étape pour une meilleure compréhension.