Sobes.tech
Middle

Como funciona o mecanismo async/await em C#?

sobes.tech IA

Resposta da IA

O mecanismo async/await permite escrever código assíncrono que parece síncrono.

  1. Palavra-chave async: Marca um método como assíncrono. Tal método pode conter a instrução await.
  2. Palavra-chave await: Usada antes de chamar uma operação assíncrona (geralmente um método que retorna Task ou Task<T>). Quando a execução chega a await, o controlo é devolvido ao método que o chamou, e o thread libertado pode realizar outra tarefa.
  3. Task / Task<T>: Representa uma promessa de completar uma operação assíncrona e o seu resultado (para Task<T>). await "espera" a conclusão desta "promessa".
  4. Máquina de estados: O compilador transforma o método assíncrono numa máquina de estados. Esta máquina guarda o estado do método ao chegar a await.
  5. Continuação: Quando a tarefa esperada termina, o ambiente de execução programa a execução da parte restante do método assíncrono (a continuação) num thread do pool ou no mesmo contexto de sincronização se estiver capturado.
  6. Retorno do controlo: Após completar a operação assíncrona, o controlo regressa ao ponto após await, e a execução do método continua com o estado guardado.
// Método assíncrono
async Task<int> GetLengthAsync(string url)
{
    // Criar cliente HTTP
    using var client = new HttpClient(); 
    // Realizar pedido assíncrono à URL
    // Await espera a conclusão do pedido sem bloquear o thread
    string content = await client.GetStringAsync(url); 
    // A continuação é executada após obter o conteúdo
    return content.Length; 
}

// Uso do método assíncrono
async void Button_Click(object sender, EventArgs e)
{
    // Await espera que GetLengthAsync termine
    // O thread da UI não fica bloqueado
    int length = await GetLengthAsync("https://example.com"); 
    // Atualizar elemento UI
    Label1.Text = $"Comprimento do conteúdo: {length}"; 
}