Resumo sobre métodos async c# - Aulas do Prof. Macoratti
- #.NET C#
De início, parabenizo a Dio e toda sua equipe de instrutores pelo empenho em desenvolver excelentes cursos, bem como a todos os colegas participantes que buscam por superar-se na trajetória da aprendizagem. De sorte, embora tenhamos excelente conteúdo, me senti submetido a necessidade de implementar um tanto a mais quando do desenvolvimento do desafio final do bootcamp Pottencial .Net Developer - Web Api de pagamentos, quando usando o Visual Studio e toda sua ferramenta, me deparei com o tema programação assíncrona.
Destacou-se nesse ponto o uso das palavras async, Task, await, e como não poderia resultar diferente, busquei entender melhor o uso da programação assíncrona. Como prometido no título, trago esse resumo como forma não de exaurir o tema, mas induzir à compreensão de forma simplificada para auxiliar no entendimento do código gerado, às vezes, de forma automática pelo Visual Studio da Microsoft. Lembro que tudo que trago aqui são citações literais e resumidas das palavras do professor Macoratti, com citação ao final do artigo:
A programação assíncrona é um poderoso recurso da linguagem C# que permite que você continue com a execução do seu programa na thread principal enquanto uma tarefa de longa duração é executada na sua própria thread separadamente da thread principal.
Quando a tarefa de longa duração estiver completa, ela permitirá que a thread principal saiba se tarefa foi concluída com sucesso ou se a operação falhou.
Na programação assíncrona, os métodos assíncronos podem ter três tipos possíveis de retorno :
void -O retorno do tipo void é usado em manipuladores de eventos, lembrando que void não retorna nada. Logo, se você chamar um método assíncrono com tipo de retorno void, seu código de chamada
deverá estar apto a continuar a execução do código sem ter que esperar pela conclusão do método assíncrono;
Task - Com métodos assíncronos que possuem um tipo de retorno Task você pode utilizar o operador await para pausar a execução da thread atual até que o método assíncrono chamado tenha sido concluído. Note que um método assíncrono que retorna um tipo Task não retorna um
operando, assim, se ele fosse escrito como um método síncrono normal, seria um método com tipo de retorno void.
Task<TResult> - Métodos assíncronos que têm uma declaração de retorno têm um tipo de retorno TResult. Em outras palavras, se o método assíncrono retornar um booleano, você deve criar um método assíncrono com um tipo de retorno Task<bool>.
Exemplo:
Class...{
static voi Main(){
Console.WriteLine("Tecle algo para iniciar...\n");
console.ReadKey();
Aguardar(5);
Console.WriteLine("Já passou 5 segundos...\n");
Console.WriteLine("fim");
Console.ReadLine();
}
static void Aguardar (int tempo){
Console.WriteLine("Iniciando espera...");
Task.Delay(TimeSpan.FromSeconds(tempo));
Console.WriteLine("Fim da espera...");
}
}
}
executando acontece:
Inciando espera...
Fim da espera...
Já passou 5 segundos...
fim
--> execução síncrona
Transormando o método Aguardar em assíncrono:
static async void Aguardar(int tempo){
Console.WriteLine("Iniciando espera...");
await Task.Delay(TimeSpan.FromSeconds(tempo));
Console.WriteLine("Fim da espera...");
}
// async deve ter await
executando acontece:
Iniciando espera...
Já passou 5 segundos
fim
// aguardando conclusão do Task.Delay por 5 segundos
//após o delay imprime na tela:
Fim da espera
O programa inicia a espera mas retorna para executar a linha após a chamada do método aguardar e segue executando. Quando a thread do metodo aguardar terminar ela retorna para a thread principal a mensagem fim da espera.
Transformando o Main em async com Task:
static async Task main(){
Console.Writeline("Tecle algo para iniciar...\n");
console.ReadKey();
//determinando que a espera da conclusão do método
await Aguardar(5);
//await é necessário por causa do async Task
Console.WriteLine("Já passou 5 segundos...\n");
Console.WriteLine("fim");
Console.ReadLine();
}
//antes => static void Aguardar(int tempo){
// agora o metodo Aguardar não pode ser void, pois o await exige a //execução de uma tarefa:
static async Task Aguardar(int tempo){
Console.WriteLine("Iniciando espera...");
await Task.Delay(TimeSpan.FromSeconds(tempo));
// com o uso de task, precisa usar await
Console.WriteLine("Fim da espera...");
}
}
}
---> executando acontece:
iniciando a espera...
//agora o programa aguarda passar o delay do método Aguardar() para //retornar a execução da thread main
Fim da espera...
Já passou 5 segundos...
fim
Em suma:
As palavras-chave async e await são usadas na programação assíncrona;
Usa-se a palavra-chave async na declaração de um método que dependa da palavra-chave await;
Ao usar o await, seu programa deve "esperar" um resultado (task)
O await espera até que o método retorne o resultado sem bloquear
o fluxo principal;
A palavra-chave await deve ser usada para receber o resultado de uma Task;
Um await só pode ser usado em um método declarado com o modificador async.
Task<T>
Deve ser usado quando precisar retornar alguma informação de um
método assíncrono.
Representa uma tarefa a ser executada que pode estar
* em processamento
ou
* pode ter sido cancelada
ou
* que falhou
ou
* ou que fio completada com sucesso
Nesse caso, Task<T> conterá o resultado da operação e poderá
ser lido na trhead principal
poder ser:
Task<int> Task<string> Task<bool> Task<Classe> Task<IEnumerable<Classe> etc
Espero que esse resumo possa contribuir para assimilação de conhecimento dos colegas, lembrando que não se trata de exaurimento do assunto mas sim de uma colaboração em forma de resumo com o fim de auxiliar na jornada de quem, assim como eu, está iniciando.
Macoratti, disponível em https://www.macoratti.net/17/10/c_progassinc1.htm#:~:text=A%20programação%20assíncrona%20é%20um,thread%20separadamente%20da%20thread%20principal.
YouTube: https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwjb6sej7Jb6AhUpH7kGHfA5Bd0QFnoECBsQAQ&url=https%3A%2F%2Fwww.youtube.com%2Fplaylist%3Flist%3DPLJ4k1IC8GhW14D6hUX8Gc1iPtODD0DKCy&usg=AOvVaw3wuFdDyRlsL_LOGPUPl6o5