Entity Framework - consulta assíncrona

Asynchronous programmingenvolve a execução de operações em segundo plano para que o thread principal possa continuar suas próprias operações. Dessa forma, o thread principal pode manter a interface do usuário responsiva enquanto o thread de segundo plano está processando a tarefa em questão.

  • O Entity Framework 6.0 oferece suporte a operações assíncronas para consultar e salvar dados.

  • As operações assíncronas podem ajudar seu aplicativo das seguintes maneiras -

    • Torne seu aplicativo mais responsivo às interações do usuário
    • Melhore o desempenho geral do seu aplicativo
  • Você pode executar operações assíncronas de várias maneiras. Mas as palavras-chave async / await foram introduzidas no .NET Framework 4.5, o que simplifica seu trabalho.

  • A única coisa que você precisa seguir é o padrão async / await conforme ilustrado pelo fragmento de código a seguir.

Vamos dar uma olhada no exemplo a seguir (sem usar async / await) em que o método DatabaseOperations salva um novo aluno no banco de dados e, em seguida, recupera todos os alunos do banco de dados e, no final, alguma mensagem adicional é impressa no 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 o código acima for executado, você receberá a seguinte saída -

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

Vamos usar o novo assíncrono e aguardar as palavras-chave e fazer as seguintes alterações em Program.cs

  • Adicione o namespace System.Data.Entity que fornecerá métodos de extensão assíncronos EF.

  • Adicione o namespace System.Threading.Tasks, que nos permitirá usar o tipo de tarefa.

  • Atualizar DatabaseOperations ser marcado como async e devolver um Task.

  • Chame a versão Async de SaveChanges e aguarde sua conclusão.

  • Chame a versão Async de ToList e aguarde o 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);
         }
      }
   }
}

Na execução, ele produzirá a seguinte saída.

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

Agora que o código é assíncrono, você pode observar um fluxo de execução diferente do seu programa.

  • SaveChanges começa a empurrar o novo Aluno para o banco de dados e então o método DatabaseOperations retorna (embora não tenha concluído a execução) e o fluxo do programa no método Main continua.

  • A mensagem é então gravada no console.

  • O encadeamento gerenciado é bloqueado na chamada Aguardar até que a operação do banco de dados seja concluída. Assim que for concluído, o restante de nosso DatabaseOperations será executado.

  • SaveChanges é concluído.

  • Todos os alunos são recuperados do banco de dados e gravados no Console.

Recomendamos que você execute o exemplo acima passo a passo para melhor compreensão.