Como posso entender o código assíncrono?

Olá, Habr! Apresento a sua atenção a tradução (com pequenas correções) do artigo "Como eu penso sobre o código assíncrono?!" por Leslie Richardson.



O código assíncrono está se tornando cada vez mais popular para escrever aplicativos responsivos. Infelizmente, a programação assíncrona também apresenta dificuldades adicionais. Como consequência, entender como esse código funciona pode ser uma tarefa difícil, independentemente da sua experiência. Se você está apenas começando a usar o código assíncrono ou deseja aprimorar seu conhecimento, esta é uma introdução ao mundo da programação assíncrona!



O que é código assíncrono?



A programação assíncrona permite que você execute um bloco de código sem parar (ou bloquear) todo o encadeamento no qual a ação está sendo executada. Um mito comum sobre o código assíncrono é que ele melhora o desempenho, o que nem sempre é verdade. Em vez disso, a principal característica da programação assíncrona é que ela aumenta o número de tarefas (largura de banda) que podem ser executadas simultaneamente, sem ter que bloquear a thread em que essas ações são executadas.



Você pode pensar que o código assíncrono é muito semelhante ao código multithread, afinal, muitos métodos podem ser executados simultaneamente em ambos os casos. Na verdade, a programação assíncrona pode ser usada com aplicativos single-threaded e multi-threaded. Isso significa que você pode ter um programa assíncrono de thread único no qual um thread pode executar tarefas paralelas. Por outro lado, você também pode ter um aplicativo assíncrono multithread onde vários threads podem executar várias tarefas paralelas.



Por que devo usar código assíncrono? Um exemplo, por favor!



Para ter alguma analogia para demonstrar a programação assíncrona, considere o processo de assar uma torta. Este processo será representado por um thread que executa várias etapas (ou tarefas), conforme mostrado no código a seguir. Este código está correto e você ainda vai acabar com um bolo delicioso após executar o método. Porém, como todo o código é síncrono, cada linha será executada sequencialmente. Em outras palavras, você ficará completamente parado enquanto espera o forno terminar de pré-aquecer. Mas, ao mesmo tempo, você pode fazer massa para sua torta!



Método MakeCake ()



imagem



Síncrono Programa de cozimento de bolo síncrono



imagem



Na vida real, você tende a dividir esse processo em tarefas, amassando a massa enquanto o forno está esquentando. Ou faça a cobertura enquanto o bolo assa no forno. Isso aumenta sua produtividade e permite assar o bolo muito mais rápido. É aqui que o código assíncrono se torna útil! Ao tornar nosso código atual assíncrono, podemos fazer outras coisas para passar o tempo enquanto aguardamos o resultado de uma tarefa , como assar uma torta no forno.

Para fazer isso, vamos alterar nosso código, bem como adicionar o método PassTheTime . Agora nosso código salva o estado da tarefa, inicia outra operação síncrona ou assíncrona e obtém o resultado da tarefa salva quando necessário.



Método MakeCake ()

imagem



Asynchronous Pie Baking Program

imagem



Comparado ao método MakeCake síncrono , que não tem o método PassTheTime , o método MakeCakeAsync assíncrono pode completar mais tarefas sem bloquear o thread, o que reduz o tempo que leva para completar o método inteiro.



Comparação de programas assíncronos e síncronos



imagem



Como faço para escrever código assíncrono em .NET?



C # permite escrever código assíncrono usando o Task tipo e os esperam e assíncronos palavras-chave . O tipo de tarefa informa o chamador de um possível tipo de retorno. Também indica que outras ações podem continuar a ser realizadas no método de chamada. A palavra-chave async é pareada com a palavra-chave await , que notifica o compilador de que precisamos de um valor de retorno do método, mas não imediatamente. Como resultado, não precisamos bloquear o thread de chamada e podemos continuar a realizar outras tarefas até que o valor esperado seja necessário. O método inicialmente assíncrono será executado de forma síncrona até que a palavra-chave await seja encontrada... Este é exatamente o momento em que a execução do método começa de forma assíncrona.



Aprendi sobre código assíncrono! O que agora?



Embora um aplicativo de cozimento de bolo assíncrono seja ótimo, existem muitos outros aplicativos do mundo real que usam código assíncrono também. Os dois exemplos mais comuns são:



Aplicativos que usam solicitações HTTP - dependendo da solicitação, as chamadas HTTP podem levar muito tempo para serem processadas. O uso de código assíncrono nos permite realizar outras operações enquanto esperamos por uma resposta do servidor.



Solicitação HTTP GET de exemplo



imagem



Aplicativos de UI - aplicativos WPF ou qualquer outro que use botões, caixas de texto e outros recursos de UX também são ótimos para implementação assíncrona. Por exemplo, um aplicativo WPF que analisa um arquivo. Este procedimento pode levar algum tempo. No entanto, ao tornar essa ação assíncrona, você ainda pode interagir com a interface do usuário sem parar completamente o aplicativo enquanto espera a conclusão da operação.



All Articles