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
asyncpalavra-chave transforma um método em um método assíncrono, que permite usar a awaitpalavra - chave em seu corpo.
- Quando a
awaitpalavra-chave é aplicada, ela suspende o método de chamada e retorna o controle ao chamador até que a tarefa esperada seja concluída.
awaitsó pode ser usado dentro de um asyncmétodo.
O contexto encontrado encontra- awaitse 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 awaittarefas 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 awaitdeles 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 awaitexecuçã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 awaits seqüencial no mesmo contexto.
Portanto, para colher os asyncbenefícios, é necessário projetar o aplicativo para executar vários contextos paralelos (interface do usuário, cliente de dados etc.) e, awaitem um contexto, gerar execução para outros contextos, para que o aplicativo inteiro não bloqueie um indivíduo await.