Oi Marco, tudo bem?
Ótima pergunta. Usamos métodos async
apenas quando uma tarefa irá realizar operações de I/O, como acesso à web, acesso a disco, etc. Essas operações podem demorar um tempo precioso, e se utilizarmos métodos síncronos, isso irá bloquear a thread da principal aplicação, que é a mesma responsável por renderizar a tela, atualizar controles, etc.
Sua dúvida é algo como: "por que usar async/await, se uma operação vai ser aguardada com await? Isso não é o mesmo que usar um método síncrono?"
Acontece que, quando você cria um método async
que retorna uma Task<int>
, isso significa que você não vai devolver um int
, mas sim uma promessa de que o número int
será retornado. Note que a instrução await
é muito difernete de Thread.Sleep()
, pois não suspende a thread. Quando o processador encontrar a instrução await
no seu método, a thread que chamou o método fica livre para realizar outras tarefas, como renderizar uma janela por N quadros por segundo, responder a teclas e cliques do usuário, etc. Assim que a operação assíncrona termina, o código após a instrução await é executado. Isso é muito rápido, pois o processador tem que fazer tudo parecer simultâneo, mesmo que não seja. Se você troca o async/await por um método síncrono, a thread da aplicação se torna refém daquela operação de disco ou de acesso a web, que pode travar a interface do usuário por alguns segundos intermináveis, e dar uma sensação muito ruim ao usuário.