Tropecei neste post que fala sobre fazer solicitações da Web assíncronas.
Agora, a simplicidade à parte, se no mundo real, tudo o que você faz é fazer uma solicitação assíncrona e aguardá-la na próxima linha, não é o mesmo que fazer uma chamada de sincronização em primeiro lugar?
c#
.net
asynchronous-programming
Mrchief
fonte
fonte
Respostas:
Não,
async + await != sync
por causa da continuaçãoDo MSDN 'Programação assíncrona com Async e Await (C # e Visual Basic)'
Por exemplo, a execução assíncrona não bloqueará o thread da interface do usuário e
Some TextBox.Text
será atualizada após a conclusão do downloadfonte
Console.WriteLine(await GetStringOverNetwork());
? E se você precisar da saída da chamada assíncrona? O programa seria bloqueado no primeiro acesso, mesmo que o encadeamento pudesse continuar com a execução?Não, não é o mesmo.
Seu
async
bloco de código está aguardando oawait
retorno da chamada para continuar, no entanto, o restante do seu aplicativo não está esperando e ainda pode continuar normalmente.Por outro lado, uma chamada síncrona faria todo o aplicativo ou thread aguardar até que o código terminasse a execução para continuar com qualquer outra coisa.
fonte
Por favor, permita-me esclarecer as coisas em relação ao assíncrono / aguardar.
Quando aguardar, a máquina de estado subjacente permite que o controle seja retornado imediatamente. Então, quando a chamada esperada for concluída, a máquina de estado subjacente permitirá que a execução continue na linha após a chamada aguardada.
Portanto, o bloco assíncrono não está bloqueado nem está aguardando o término da chamada esperada; O controle é retornado imediatamente quando o comando de espera é encontrado.
A máquina de estado subjacente faz parte da "mágica" por trás do uso de async / wait que não é desutilizada e perdida.
fonte
Eu tropecei nisso com a mesma pergunta em mente, mas depois de ler as respostas, a pergunta parece persistir, confusa com as referências à "mágica escondida".
Na programação assíncrona mencionada acima :
O contexto encontrado encontra-
await
se bloqueado?O restante do aplicativo bloqueia no
await
?Depende de como seu aplicativo foi gravado. Se houver uma série de
await
tarefas ed dependentes iniciadas sequencialmente no mesmo contexto (consulte: Tentando entender algum comportamento assíncrono / aguardar )Dessa maneira, cada um
await
deles bloquearia a desova do próximo.Por outro lado, as mesmas tarefas dependentes lançadas em paralelo seriam executadas em paralelo e o contexto seria bloqueado apenas nas respectivas.
await
:Em geral, a
await
execução gera o contexto externo, de onde o contexto atual é chamado. No entanto, se o contexto externo em si está aguardando a corrente, é como umawait
s seqüencial no mesmo contexto.Portanto, para colher os
async
benefícios, é necessário projetar o aplicativo para executar vários contextos paralelos (interface do usuário, cliente de dados etc.) e,await
em um contexto, gerar execução para outros contextos, para que o aplicativo inteiro não bloqueie um indivíduoawait
.fonte