Entity Framework - Query asincrona

Asynchronous programmingimplica l'esecuzione di operazioni in background in modo che il thread principale possa continuare le proprie operazioni. In questo modo il thread principale può mantenere reattiva l'interfaccia utente mentre il thread in background elabora l'attività in corso.

  • Entity Framework 6.0 supporta operazioni asincrone per l'esecuzione di query e il salvataggio dei dati.

  • Le operazioni asincrone possono aiutare la tua applicazione nei seguenti modi:

    • Rendi la tua applicazione più reattiva alle interazioni degli utenti
    • Migliora le prestazioni complessive della tua applicazione
  • È possibile eseguire operazioni asincrone in vari modi. Ma le parole chiave async / await sono state introdotte in .NET Framework 4.5 che semplifica il tuo lavoro.

  • L'unica cosa che devi seguire è il modello async / await come illustrato dal frammento di codice seguente.

Diamo un'occhiata al seguente esempio (senza usare async / await) in cui il metodo DatabaseOperations salva un nuovo studente nel database e quindi recupera tutti gli studenti dal database e alla fine viene stampato un messaggio aggiuntivo sulla 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);
         }
      }
   }
}

Quando il codice sopra viene eseguito, riceverai il seguente output:

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

Usiamo le nuove parole chiave async e await e apportiamo le seguenti modifiche a Program.cs

  • Aggiungi lo spazio dei nomi System.Data.Entity che fornirà metodi di estensione asincroni EF.

  • Aggiungi lo spazio dei nomi System.Threading.Tasks che ci consentirà di utilizzare il tipo di attività.

  • Aggiornare DatabaseOperations da contrassegnare come async e restituisci un file Task.

  • Chiama la versione Async di SaveChanges e attendi il suo completamento.

  • Chiama la versione asincrona di ToList e attendi il risultato.

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

All'esecuzione, produrrà il seguente output.

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

Ora che il codice è asincrono, puoi osservare un diverso flusso di esecuzione del tuo programma.

  • SaveChanges inizia a inviare il nuovo Student al database, quindi il metodo DatabaseOperations restituisce (anche se non ha terminato l'esecuzione) e il flusso del programma nel metodo Main continua.

  • Il messaggio viene quindi scritto nella console.

  • Il thread gestito viene bloccato nella chiamata di attesa fino al completamento dell'operazione del database. Una volta completato, verrà eseguito il resto delle nostre operazioni di database.

  • SaveChanges viene completato.

  • Recupera tutto lo studente dal database e viene scritto nella Console.

Si consiglia di eseguire l'esempio precedente in modo graduale per una migliore comprensione.