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 :
- A
async
palavra-chave transforma um método em um método assíncrono, que permite usar a await
palavra - chave em seu corpo.
- Quando a
await
palavra-chave é aplicada, ela suspende o método de chamada e retorna o controle ao chamador até que a tarefa esperada seja concluída.
await
só pode ser usado dentro de um async
método.
O contexto encontrado encontra- await
se bloqueado?
- Sim . Essa é essencialmente uma barreira de sincronização local para manter um estado conhecido no contexto da execução; exceto que outros contextos, se houver, não são unidos.
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 )
await asyncCall1();
await asyncCall2(); // waits for asyncCall1() to complete
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
:
Task<int> t1 = asyncCall1();
Task<string> t2 = asyncCall2(); // runs in parallel with asyncCall1()
int val = await t1;
string str = await t2; // waits for asyncCall1() to complete
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 um await
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íduo await
.