async e await em C#

Muhammad Maisam Abbas 16 fevereiro 2024
async e await em C#

Este tutorial discutirá a programação assíncrona em C#.

Programação Assíncrona em C#

Se algum processo for bloqueado em um aplicativo síncrono, todo o aplicativo será bloqueado e deixará de responder até que o processo específico seja concluído. Podemos usar programação assíncrona neste cenário. Com a programação assíncrona, nosso aplicativo pode continuar trabalhando em segundo plano em algumas tarefas independentes até que esse processo específico seja executado. Na programação assíncrona, todo o nosso aplicativo não depende simplesmente de um único processo demorado. A programação assíncrona é usada com tarefas associadas a I/O ou CPU. O principal uso da programação assíncrona é criar uma interface de usuário responsiva que não fique presa enquanto espera por um processo vinculado a I/O ou CPU para concluir sua execução. As palavras-chave await e async são usadas para programação assíncrona em C#. A palavra-chave await devolve o controle à função de chamada. A palavra-chave await é a principal palavra-chave que permite a programação assíncrona em C#. A palavra-chave async ativa a palavra-chave await. Uma função que utiliza a palavra-chave await deve ter a palavra-chave async e retornar um objeto Task em C#. A palavra-chave await não pode ser usada sem a palavra-chave async em C#. O exemplo de código a seguir demonstra a programação síncrona em C#.

using System;
using System.Threading.Tasks;

namespace async_and_await {
  class Program {
    public static void process1() {
      for (int i = 0; i < 5; i++) {
        Console.WriteLine("Process 1");
        Task.Delay(100).Wait();
      }
    }
    public static void process2() {
      for (int i = 0; i < 5; i++) {
        Console.WriteLine("Process 2");
        Task.Delay(100).Wait();
      }
    }
    static void Main(string[] args) {
      process1();
      process2();
    }
  }
}

Resultado:

Process 1
Process 1
Process 1
Process 1
Process 1
Process 2
Process 2
Process 2
Process 2
Process 2

No código acima, as funções process1() e process2() são processos independentes, mas a função process2() deve aguardar a conclusão da função process1(). Este código de programação síncrona simples pode ser convertido em programação assíncrona com as palavras-chave async e await em C#.

using System;
using System.Threading.Tasks;

namespace async_and_await {
  class Program {
    public static async Task process1() {
      await Task.Run(() => {
        for (int i = 0; i < 5; i++) {
          Console.WriteLine("Process 1");
          Task.Delay(100).Wait();
        }
      });
    }
    public static void process2() {
      for (int i = 0; i < 5; i++) {
        Console.WriteLine("Process 2");
        Task.Delay(100).Wait();
      }
    }
    static void Main(string[] args) {
      process1();
      process2();
    }
  }
}

Resultado:

Process 2
Process 1
Process 1
Process 2
Process 2
Process 1
Process 1
Process 2
Process 2
Process 1

No código acima, usamos as palavras-chave async e await para converter o exemplo anterior para programação assíncrona. A saída mostra claramente que a função process2() não espera para completar a função process1(). Na definição da função process1(), usamos a palavra-chave async para sugerir que esta é uma função de execução assíncrona. A palavra-chave await na função process1() devolve o controle à função principal, que então chama a função process2(). O controle continua alternando entre as funções process1() e process2() até a conclusão da função process1().

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn