Introdução à programação assíncrona

Concluído

Os desenvolvedores usam técnicas de programação assíncronas para evitar gargalos de desempenho e aprimorar a capacidade de resposta geral de seus aplicativos. No entanto, as técnicas tradicionais para desenvolver aplicativos assíncronos podem ser complicadas, dificultando seu desenvolvimento, depuração e manutenção.

O C# dá suporte a uma abordagem de programação assíncrona simplificada que aproveita o suporte assíncrono no runtime do .NET. O compilador faz o trabalho difícil que o desenvolvedor costumava fazer e seu aplicativo mantém uma estrutura lógica semelhante a um código síncrono. Como resultado, você obtém todas as vantagens da programação assíncrona com uma fração do esforço.

Entender como os processos assíncronos funcionam no mundo real pode ajudá-lo a entender como usar programação assíncrona em seus aplicativos.

Examinar um processo assíncrono no mundo real

Fazer café da manhã é um bom exemplo de um processo que se beneficia da execução de tarefas de forma assíncrona. Você pode pensar em fazer café da manhã como uma série de tarefas que podem ser executadas de forma síncrona ou assíncrona.

  1. Pegue os ingredientes do café da manhã da despensa.
  2. Sirva uma xícara de café.
  3. Aqueça uma panela, depois frite três fatias de bacon.
  4. Frite dois ovos.
  5. Torra dois pedaços de pão.
  6. Espalhe manteiga e geléia na torrada.
  7. Despeje um copo de suco de laranja.

Se você tiver experiência com culinária, poderá concluir essas instruções de forma assíncrona. Você começa a esquentar a panela para o bacon e os ovos e, em seguida, pega os ingredientes da despensa. Você coloca o pão na torradeira, depois começa a cozinhar o bacon. Em cada etapa do processo, você inicia uma tarefa e, em seguida, faz a transição para outras tarefas que estão prontas para sua atenção.

Cozinhar café da manhã é um bom exemplo de trabalho assíncrono que não é paralelo. Uma pessoa (ou thread) pode lidar com todas as tarefas. Uma pessoa pode fazer o café da manhã de forma assíncrona iniciando a próxima tarefa antes que a tarefa anterior seja concluída. Cada tarefa de cozimento progride independentemente de alguém estar assistindo ativamente o processo. Assim que você começar a aquecer a panela, você pode obter ingredientes da despensa. Depois que o bacon começar a cozinhar, você pode colocar o pão na torradeira.

Para um algoritmo paralelo, você precisa de várias pessoas que cozinham (ou vários threads). Uma pessoa cozinha os ovos, outra frita o bacon, e assim por diante. Cada pessoa se concentra em uma tarefa específica. Cada pessoa que está cozinhando (ou cada thread) está bloqueada sincronizadamente enquanto espera a conclusão da tarefa atual: o bacon pronto para virar, o pão pronto para sair da torradeira, e assim por diante.

Usando técnicas de programação assíncronas, você pode melhorar a eficiência e a capacidade de resposta do seu aplicativo, assim como você pode tornar o café da manhã de forma mais eficiente executando várias tarefas ao mesmo tempo.

Async melhora a capacidade de resposta

A assincronia é essencial para atividades que são potencialmente bloqueantes, como o acesso à Web. Às vezes, o acesso a um recurso da Web é lento ou atrasado. Se essa atividade for bloqueada em um processo síncrono, todo o aplicativo deverá aguardar. Em um processo assíncrono, o aplicativo pode continuar com outro trabalho que não depende do recurso da Web até que a tarefa potencialmente bloqueada seja concluída.

A tabela a seguir mostra áreas típicas em que a programação assíncrona melhora a capacidade de resposta. As APIs listadas do .NET e do Windows Runtime contêm métodos que dão suporte à programação assíncrona.

Área do Aplicativo Tipos .NET com métodos assíncronos Tipos de tempo de execução do Windows com métodos assíncronos
Acesso à Web HttpClient Windows.Web.Http.HttpClient, SyndicationClient
Como trabalhar com arquivos JsonSerializer, StreamReader, StreamWriter, etc. StorageFile
Trabalhando com imagens MediaCapture, BitmapEncoder, BitmapDecoder
Programação do WCF Operações síncronas e assíncronas

Como criar e chamar métodos assíncronos

Em C#, operações assíncronas são implementadas usando as palavras-chave async e await. A async palavra-chave é usada para definir um método assíncrono, enquanto a await palavra-chave é usada para chamar um método assíncrono e aguardar seu resultado sem bloquear o thread de chamada. As operações assíncronas normalmente são implementadas usando os tipos Task ou Task<T>, que representam uma operação em andamento que pode ser aguardada.

Aqui está um exemplo de como criar e chamar uma tarefa assíncrona em C#:


using System;
using System.IO;
using System.Threading.Tasks;

public class Program
{
    public static async Task Main()
    {
        string filePath = "example.txt";
        string content = await ReadFileAsync(filePath);
        Console.WriteLine(content);
    }

    public static async Task<string> ReadFileAsync(string filePath)
    {
        using (StreamReader reader = new StreamReader(filePath))
        {
            string content = await reader.ReadToEndAsync();
            return content;
        }
    }
}

Neste exemplo, o ReadFileAsync método é definido usando a async palavra-chave e tem um tipo de retorno de Task<string>. A async palavra-chave indica que o método contém operações assíncronas e o tipo de Task<string> retorno indica que o método retorna uma tarefa que representa a operação assíncrona. O Task<string> tipo é uma tarefa genérica que representa uma operação assíncrona que retorna um valor de cadeia de caracteres. O ReadFileAsync método usa um caminho de arquivo como um parâmetro e lê o conteúdo do arquivo de forma assíncrona.

O Main método também é definido como assíncrono, permitindo que ele chame o ReadFileAsync método usando a await palavra-chave. A await palavra-chave é usada para indicar que o programa deve aguardar o resultado da operação assíncrona antes de continuar. Nesse caso, o programa aguarda que o arquivo seja lido antes de imprimir seu conteúdo no console.

Resumo

Nesta unidade, você aprendeu sobre os benefícios da programação assíncrona e como ela pode melhorar a capacidade de resposta de seus aplicativos. Você também aprendeu a criar e chamar métodos assíncronos usando as palavras-chave async e await em C#. Usando essas técnicas, você pode escrever aplicativos mais eficientes e responsivos que podem lidar com operações potencialmente bloqueadas sem congelar a interface do usuário ou bloquear outras tarefas.

Pontos-chave

  • A programação assíncrona aprimora o desempenho e a capacidade de resposta do aplicativo.
  • O C# fornece uma abordagem simplificada para programação assíncrona.
  • A programação assíncrona é benéfica para potencialmente bloquear atividades como o acesso à Web.
  • Em C#, métodos assíncronos são criados usando a async palavra-chave e chamados usando a await palavra-chave.
  • Os tipos Task ou Task<T> representam operações em andamento que podem ser esperadas em C#.