Introdução aos métodos assíncronos e síncronos em C# - PT. 1
Neste artigo, vamos comparar os métodos assíncronos e síncronos em C# e discutir quando é mais adequado utilizar cada um deles.
Situação: Imagine que você esteja se preparando para receber alguns convidados e precisa arrumar a casa, e lavar algumas roupas para recebê-los em breve.
Código C# da situação (Síncrono):
using System;
using System.Threading.Tasks;
namespace ConsoleSync
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine($"Iniciando tarefas... | Data e Hora: {DateTime.Now} \n");
// Chama os métodos de forma síncrona
LavarRoupa();
ArrumarCasa();
Console.WriteLine($"Todas as tarefas foram concluídas! | Data e Hora: {DateTime.Now}");
}
static void LavarRoupa()
{
Console.WriteLine($"Início da lavagem de roupa. | Data e Hora: {DateTime.Now} \n");
Task.Delay(5000).Wait();
Console.WriteLine($"Fim da lavagem de roupa. | Data e Hora: {DateTime.Now} \n");
}
static void ArrumarCasa()
{
Console.WriteLine($"Início do arrumar a casa. | Data e Hora: {DateTime.Now} \n");
Task.Delay(3000).Wait();
Console.WriteLine($"Fim do arrumar a casa. | Data e Hora: {DateTime.Now} \n");
}
}
}
Saída do Console:
No exemplo apresentado, o método "LavarRoupa" é invocado e executado antes do método "ArrumarCasa". Isso significa que a ação de arrumar a casa só é iniciada após a finalização do método "LavarRoupa". A execução total deste código leva 8 segundos para ser concluída.
Para aproveitar ao máximo o tempo disponível e realizar as duas tarefas de maneira mais eficiente, seria ideal executar as ações de arrumar a casa e lavar roupa de maneira simultânea. No C#, podemos utilizar métodos assíncronos para realizar essa otimização de tempo. Dessa forma, enquanto a roupa está sendo lavada, podemos iniciar a tarefa de arrumar a casa.
Código C# da situação (Assíncrono):
using System;
using System.Threading.Tasks;
namespace ConsoleAsync
{
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine($"Iniciando tarefas... | Data e Hora: {DateTime.Now} \n");
// Chama os métodos de forma assíncrona
var task1 = LavarRoupaAsync();
var task2 = ArrumarCasaAsync();
// Aguarda até que todas as tarefas sejam concluídas
await Task.WhenAll(task1, task2);
Console.WriteLine($"Todas as tarefas foram concluídas! | Data e Hora: {DateTime.Now}");
}
static async Task LavarRoupaAsync()
{
Console.WriteLine($"Início da lavagem de roupa. | Data e Hora: {DateTime.Now} \n");
await Task.Delay(5000);
Console.WriteLine($"Fim da lavagem de roupa. | Data e Hora: {DateTime.Now} \n");
}
static async Task ArrumarCasaAsync()
{
Console.WriteLine($"Início do arrumar a casa. | Data e Hora: {DateTime.Now} \n");
await Task.Delay(3000);
Console.WriteLine($"Fim do arrumar a casa. | Data e Hora: {DateTime.Now} \n");
}
}
}
Saída do Console:
No segundo exemplo, a chamada do método "LavarRoupaAsync" é realizada ao mesmo tempo que o método "ArrumarCasaAsync". Como resultado, o método "ArrumarCasaAsync" é finalizado antes do "LavarRoupaAsync" e o tempo total de execução deste código é de 5 segundos, economizando 3 segundos em comparação com a execução síncrona, o que é um ganho significativo.
Espero que este artigo tenha sido útil para você e que você tenha gostado dele. Se tiver sugestões de como posso melhorá-lo ou quiser deixar algum comentário, ficarei feliz em ler seu feedback nos comentários abaixo. Sua opinião é muito importante para mim e me incentiva a continuar produzindo esse tipo de conteúdo.
Continua..
Por que voce colocou
var task2 = ArrumarCasaAsync();
?
não daria pra colocar simplismente await ArrumarCasaAsync();
?
Parabéns pelo excelente conteúdo! Eu começei a aprender mais sobre C# recentemente com o Balta. Espero ver mais conteúdo de C# por aqui
Uma introdução muito boa e sucinta. Obrigado, Cyrillo.