Entity Framework: consulta asincrónica

Asynchronous programmingimplica ejecutar operaciones en segundo plano para que el hilo principal pueda continuar sus propias operaciones. De esta manera, el hilo principal puede mantener la interfaz de usuario receptiva mientras el hilo en segundo plano procesa la tarea en cuestión.

  • Entity Framework 6.0 admite operaciones asincrónicas para consultar y guardar datos.

  • Las operaciones asincrónicas pueden ayudar a su aplicación de las siguientes maneras:

    • Haga que su aplicación responda mejor a las interacciones de los usuarios
    • Mejore el rendimiento general de su aplicación
  • Puede ejecutar operaciones asincrónicas de varias formas. Pero las palabras clave async / await se introdujeron en .NET Framework 4.5, lo que simplifica su trabajo.

  • Lo único que debe seguir es el patrón async / await como se ilustra en el siguiente fragmento de código.

Echemos un vistazo al siguiente ejemplo (sin usar async / await) en el que el método DatabaseOperations guarda un nuevo estudiante en la base de datos y luego recupera a todos los estudiantes de la base de datos y al final se imprime algún mensaje adicional en la consola.

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

Cuando se ejecuta el código anterior, recibirá el siguiente resultado:

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

Usemos las nuevas palabras clave async y await y realicemos los siguientes cambios en Program.cs

  • Agregue el espacio de nombres System.Data.Entity que le dará a EF métodos de extensión asíncronos.

  • Agregue el espacio de nombres System.Threading.Tasks que nos permitirá usar el tipo de Tarea.

  • Actualizar DatabaseOperations ser marcado como async y devolver un Task.

  • Llame a la versión Async de SaveChanges y espere a que se complete.

  • Llame a la versión Async de ToList y espere el resultado.

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

En la ejecución, producirá la siguiente salida.

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

Ahora que el código es asincrónico, puede observar un flujo de ejecución diferente de su programa.

  • SaveChanges comienza a enviar al nuevo estudiante a la base de datos y luego el método DatabaseOperations regresa (aunque no ha terminado de ejecutarse) y el flujo del programa en el método Main continúa.

  • Luego, el mensaje se escribe en la consola.

  • El subproceso administrado se bloquea en la llamada de espera hasta que se complete la operación de la base de datos. Una vez que se complete, se ejecutará el resto de nuestras operaciones de base de datos.

  • Se completa SaveChanges.

  • Recupera todo el alumno de la base de datos y se escribe en la consola.

Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprensión.