Resumo : neste tutorial, você aprenderá como usar as palavras-chave C# async
/ await
para 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
método funciona da seguinte maneira:ShowFileContents()
- O
método lê o conteúdo do arquivo de forma assíncrona e retorna umFile.ReadAllLinesAsync
()Task<string[]>
objeto. - Para mostrar o conteúdo do arquivo após
a conclusão do método, usamos oFile.ReadAllLinesAsync
()
método. Dentro do método, obtemos todas as linhas do arquivo naContinueWith()
t.Result
propriedade, que é um array de strings. - O método itera pelas linhas usando um
foreach
loop 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.txt
arquivo do C:\temp
diretó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/await
palavras-chave.
Quando um método é marcado com a async
palavra-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 async
métodos precisam ter uma await
palavra-chave em seu corpo. A await
palavra-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 await
palavra-chave para aguardar um objeto Task
ou Task<T>
. A await
palavra-chave pausa o async
método até que a operação assíncrona seja concluída e retoma a execução de onde parou.
Observe que a await
palavra-chave só é válida dentro de um async
método.
O exemplo a seguir converte o programa acima naquele que usa as async/await
palavras-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
usando a ShowFileContentsAsync
async
palavra-chave. Indica que o método contém operações assíncronas. Por convenção, um método assíncrono possui o Async
sufixo.
Em segundo lugar, use a palavra-chave para aguardar a conclusão await
do método e obter os resultados como uma matriz de strings.
()File.ReadAllLinesAsync
Nos bastidores, o
é executado em um thread separado e pausa o File.ReadAllLinesAsync
método. Depois de ShowFileContentsAsync()
concluído, ele retoma a execução do
()File.ReadAllLinesAsync
método.ShowFileContentsAsync()
Terceiro, use um foreach
loop para exibir cada linha da matriz de linhas no console.
Por fim, marque o Main()
método como um async
método e use a await
palavra-chave para aguardar a ShowFileContentsAsync()
conclusão do método.
Como você pode ver, a async/await
palavra-chave simplifica o código para programação assíncrona.
Resumo
- Use a
async
palavra-chave para marcar um método que contém operações assíncronas. - Use a
await
palavra-chave dentro de umasync
método para aguardar umTask
ouTask<T>
. - A
await
palavra-chave pausa oasync
método, executa a operação assíncrona em um thread separado e retoma a execução de onde parou. - Sempre use
async
eawait
junto. - Sempre retorne a
Task
de um método assíncrono. - Sempre
await
um método assíncrono para validar a operação assíncrona. - Use
async
eawait
em toda a cadeia. - Não use
async void
a menos que seja um manipulador de eventos. - Não bloqueie uma operação assíncrona chamando o
Result
ouWait()
de um arquivoTask
.