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();?

Ótima pergunta! A palavra-chave `await` serve para esperar pelo término de uma operação assíncrona, ou seja, a execução ficaria suspensa até que fosse retornado esse método. Só depois do retorno, a execução do método principal continuaria, semelhante ao funcionamento síncrono, isso é útil quando precisamos do retorno do método assíncrono para continuar a execução, mas esse não é o nosso caso, pois queríamos executar as duas tarefas de forma paralela, na continuação do artigo irei colocar um exemplo comparativo para que fique claro a diferença.

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

Obrigado pelo comentário!! O Balta é uma excelente referência no mundo de .NET/C#.

Uma introdução muito boa e sucinta. Obrigado, Cyrillo.