image

Acesse bootcamps ilimitados e +650 cursos

50
%OFF
Article image

JM

Jaison Machado15/09/2022 10:29
Compartilhe

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 

Compartilhe
Comentários (1)

JA

João Andrade - 15/09/2022 14:28

Eu vi um exemplo simples de async usando a linguagem Go... uma das coisas mais lindas da programação.

A velocidade de execução com várias threads é impressionante! Ver isso em tempo de execução é mais impressionante ainda, mesmo que seja um exemplo simples.

E como tudo na programação tem um preço, não basta apenas usar threads que tudo vai ficar igual a bala... Seria bom que fosse assim. É preciso gerenciar, e é por isso que a go é uma grande pedida quando o assunto é thread..

O assunto é interessante!

Valeu pelo artigo... Iniciando o projeto final e o mesmo será de grande valia.