C# assíncrono/espera

Resumo : neste tutorial, você aprenderá como usar as palavras-chave C# async/ awaitpara programação assíncrona.

Introdução às palavras-chave assíncronas/aguardadas em C#

O método a seguir lê um arquivo de texto de forma assíncrona e exibe seu conteúdo no console:

class Program
{
    static void ShowFileContents(string filename)
    {
        var task = File.ReadAllLinesAsync(filename);

        task.ContinueWith(t =>
        {
            var lines = t.Result;
            foreach (var line in lines)
            {
                Console.WriteLine(line);
            }
        });

    }


    static void Main()
    {
        ShowFileContents("C:\\temp\\readme.txt");
        Console.Read();
    }
}Linguagem de código:  C#  ( cs )

Como funciona.

Primeiro, defina o ShowFileContents()método que recebe um parâmetro de string filename. O filename parâmetro especifica o caminho para o arquivo a ser lido.

O ShowFileContents()método funciona da seguinte maneira:

  • O File.ReadAllLinesAsync()método lê o conteúdo do arquivo de forma assíncrona e retorna um Task<string[]>objeto.
  • Para mostrar o conteúdo do arquivo após File.ReadAllLinesAsync()a conclusão do método, usamos o ContinueWith()método. Dentro do método, obtemos todas as linhas do arquivo na t.Resultpropriedade, que é um array de strings.
  • O método itera pelas linhas usando um foreachloop e exibe cada linha no console.

Segundo, defina o Main()método como o principal ponto de entrada do programa.

O Main()método usa o ShowFileContents()método para ler o readme.txtarquivo do C:\tempdiretório e exibir seu conteúdo no console.

O programa funciona bem. Mas o código é bastante detalhado e um tanto difícil de seguir. Para simplificar, C# introduz as async/awaitpalavras-chave.

Quando um método é marcado com a asyncpalavra-chave, ele contém operações assíncronas que são executadas em um thread separado. Isso permite que o método retorne imediatamente sem bloquear o thread de chamada.

Os asyncmétodos precisam ter uma awaitpalavra-chave em seu corpo. A awaitpalavra-chave aguarda a conclusão de uma operação assíncrona antes de continuar a execução atual.

Além disso, você pode usar a awaitpalavra-chave para aguardar um objeto Taskou Task<T>. A awaitpalavra-chave pausa o asyncmétodo até que a operação assíncrona seja concluída e retoma a execução de onde parou.

Observe que a awaitpalavra-chave só é válida dentro de um asyncmétodo.

O exemplo a seguir converte o programa acima naquele que usa as async/awaitpalavras-chave.

class Program
{
    static async Task ShowFileContents(string filename)
    {
        var lines = await File.ReadAllLinesAsync(filename);

        foreach (var line in lines)
        {
            Console.WriteLine(line);
        }
    }

    static async Task Main()
    {
        await ShowFileContents("C:\\temp\\readme.txt");
        Console.Read();
    }
}
Linguagem de código:  C#  ( cs )

Como funciona.

Primeiro, marque ShowFileContentsAsyncusando a asyncpalavra-chave. Indica que o método contém operações assíncronas. Por convenção, um método assíncrono possui o Asyncsufixo.

Em segundo lugar, use a palavra-chave para aguardar a conclusão awaitdo método e obter os resultados como uma matriz de strings.File.ReadAllLinesAsync()

Nos bastidores, o File.ReadAllLinesAsyncé executado em um thread separado e pausa o ShowFileContentsAsync()método. Depois de File.ReadAllLinesAsync()concluído, ele retoma a execução do ShowFileContentsAsync()método.

Terceiro, use um foreachloop para exibir cada linha da matriz de linhas no console.

Por fim, marque o Main()método como um asyncmétodo e use a awaitpalavra-chave para aguardar a ShowFileContentsAsync()conclusão do método.

Como você pode ver, a async/awaitpalavra-chave simplifica o código para programação assíncrona.

Resumo

  • Use a asyncpalavra-chave para marcar um método que contém operações assíncronas.
  • Use a awaitpalavra-chave dentro de um asyncmétodo para aguardar um Taskou Task<T>.
  • A awaitpalavra-chave pausa o asyncmétodo, executa a operação assíncrona em um thread separado e retoma a execução de onde parou.
  • Sempre use async e await junto.
  • Sempre retorne a Taskde um método assíncrono.
  • Sempre awaitum método assíncrono para validar a operação assíncrona.
  • Use asynce awaitem toda a cadeia.
  • Não use async voida menos que seja um manipulador de eventos.
  • Não bloqueie uma operação assíncrona chamando o Resultou Wait()de um arquivo Task.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *