2
respostas

[Dúvida] Os métodos demorados realmente precisam ser assíncronos?

Após a leitura de todo o artigo "Programação assíncrona" da Microsoft proposto e relembrar o uso e a forma de uso da programação assíncrona no trabalho (exatamente com o uso proposto pela Microsoft) eu levanto algumas perguntas:

Visto que o uso do async e await faz o método da classe principal aguardar a finalização do método chamado por await, na prática não tem o mesmo resultado porém com mais processamento pelo C# ("O que acontece nos bastidores") do que se todo o método já fosse executado de modo síncrono?

Dessa forma entendo que um bom uso é na computação paralela em que não há esse travamento do método principal ou que há mais de um método await sendo executado ao mesmo tempo. Neste caso, sei que ao passar uma classe como argumento é passado a referência, no entanto caso seja passado uma struct ou uma variável elementar (int, float etc) é realizado a cópia. Por acaso existe algum curso da alura que explora mais afundo essa questão específica?

2 respostas

Olá, André. Tudo bem?

Entendo suas dúvidas e vou tentar esclarecê-las da melhor maneira possível.

Primeiramente, é importante entender que métodos assíncronos não são necessariamente mais lentos do que métodos síncronos. O uso de async e await permite que o sistema continue processando outras tarefas enquanto aguarda a conclusão de uma tarefa demorada, o que pode melhorar a eficiência geral do sistema.

Por exemplo, imagine um cenário em que você precisa fazer uma requisição a uma API externa. Se você fizer isso de maneira síncrona, todo o sistema ficará aguardando a resposta dessa API, mesmo que tenha outras tarefas que poderiam ser executadas nesse meio tempo. Agora, se você fizer isso de maneira assíncrona, enquanto o sistema aguarda a resposta da API, ele pode continuar processando outras tarefas. Isso torna o sistema mais eficiente, pois ele não fica "parado" aguardando a conclusão de uma única tarefa.

Quanto à sua dúvida sobre passagem de argumentos, quando você passa uma struct ou um tipo primitivo (como int, float etc.) para um método, o C# realmente faz uma cópia desse valor. Já quando você passa uma classe, o que é passado é uma referência para o objeto. Isso significa que, se você modificar o objeto dentro do método, essas modificações serão refletidas fora do método também. Isso não acontece com structs e tipos primitivos, pois como são passados por valor, as modificações feitas dentro do método não afetam o valor original.

Sobre o curso que explora mais a fundo essa questão, a Alura tem vários cursos que abordam esses conceitos, como o curso "C# parte 2: Introdução à Orientação a Objetos" e "C# parte 3: Entendendo herança e interface". Esses cursos abordam os conceitos de tipos de valor e tipos de referência, que são fundamentais para entender a diferença entre passagem por valor e passagem por referência.

Espero ter ajudado e bons estudos!

Primeiramente, obrigado por expor os cursos que a Alura aborda esses conceitos. A manipulação de referência eu conheço a um tempo por ter aprendido em C e a passagem por referência (utilizando classes nos argumentos) eu até faço uso por conta disso.

E quanto ao async e await vc tocou no ponto que é de meu conhecimento. Porém a minha pergunta é em relação ao uso simples de await.

public async Task ListaPetsDeveRetornarUmaListaNaoVazia()
{
    // Arrange
    var clientePet = new HttpClientPet();
    
    // Act
    var lista = await clientePet.ListPetAsync();
    
    [...]
}

Nesta situação vista na aula por exemplo: vc concorda que a rotina (executada em uma thread, daremos o nome de testThread) irá executar as linhas e na linha do await ela irá: 1- Criar outra thread para executar a rotina clientePet.ListPetAsync() 2- Pausar a testThread até a conclusão da petThread.

Nesta situação visto a leitura do artigo da Microsoft seria mais eficiente se a própria rotina "clientePet.ListPetAsync()" não fosse assíncrona e por conta do mencionado acima teria o mesmo efeito prático (Nesta situação desta implementação). É mais nesse ponto de vista que está o meu questionamento ^^