Para um aprendizado mais rápido ..
Entenda o fluxo de execução do método (com um diagrama): 3 minutos
Introspecção de perguntas (pelo aprendizado): 1 min
Obtenha rapidamente o açúcar da sintaxe: 5 minutos
Compartilhe a confusão de um desenvolvedor: 5 minutos
Problema: Altere rapidamente uma implementação do código normal do mundo real para código assíncrono: 2 minutos
Onde a próxima?
Entenda o fluxo de execução do método (com um diagrama): 3 minutos
Nesta imagem, concentre-se no número 6 (nada mais)
Na etapa 6: a execução parou aqui, pois ficou sem trabalho. Para continuar, ele precisa de um resultado de getStringTask (tipo de função). Portanto, ele usa um await
operador para suspender seu progresso e devolver o controle (rendimento) ao chamador (deste método em que estamos). A chamada real para getStringTask foi feita anteriormente no # 2. No segundo, foi feita uma promessa de retornar um resultado de sequência. Mas quando retornará o resultado? Devemos (# 1: AccessTheWebAsync) fazer uma segunda chamada novamente? Quem obtém o resultado, # 2 (declaração de chamada) ou # 6 (declaração de espera)
O chamador externo do AccessTheWebAsync () também está aguardando agora. Portanto, quem está chamando aguardando AccessTheWebAsync e AccessTheWebAsync está esperando GetStringAsync no momento. O interessante é que o AccessTheWebAsync fez algum trabalho antes de esperar (nº 4), talvez para economizar tempo. A mesma liberdade de multitarefa também está disponível para o chamador externo (e todos os chamadores na cadeia) e essa é a maior vantagem desse coisinho 'assíncrono'! Você sente que é síncrono ... ou normal, mas não é.
Lembre-se de que o método já foi retornado (nº 2), não pode retornar novamente (sem segunda vez). Então, como o chamador saberá? É tudo sobre tarefas! Tarefa foi aprovada. A tarefa foi aguardada (não método, não valor). O valor será definido na tarefa. O status da tarefa será definido como concluído. O chamador apenas monitora a tarefa (nº 6). Então 6 # é a resposta para onde / quem obtém o resultado. Mais leituras para mais tarde aqui .
Introspecção de perguntas para fins de aprendizado: 1 min
Vamos ajustar um pouco a pergunta:
Como e quando usar e ? async
await
Tasks
Como o aprendizado Task
abrange automaticamente os outros dois (e responde à sua pergunta)
Obtenha rapidamente o açúcar da sintaxe: 5 minutos
Antes da conversão (método original)
internal static int Method(int arg0, int arg1)
{
int result = arg0 + arg1;
IO(); // Do some long running IO.
return result;
}
um método Task-ified para chamar o método acima
internal static Task<int> MethodTask(int arg0, int arg1)
{
Task<int> task = new Task<int>(() => Method(arg0, arg1));
task.Start(); // Hot task (started task) should always be returned.
return task;
}
Nós mencionamos aguardar ou assíncrono? Não. Chame o método acima e você terá uma tarefa que poderá monitorar. Você já sabe o que a tarefa retorna .. um número inteiro.
Chamar uma tarefa é um pouco complicado e é quando as palavras-chave começam a aparecer. Vamos chamar MethodTask ()
internal static async Task<int> MethodAsync(int arg0, int arg1)
{
int result = await HelperMethods.MethodTask(arg0, arg1);
return result;
}
O mesmo código acima foi adicionado à imagem abaixo:
- Estamos "aguardando" que a tarefa seja concluída. Daí a
await
- Como usamos wait, devemos usar
async
(sintaxe obrigatória)
- MethodAsync com
Async
como prefixo (padrão de codificação)
await
é fácil de entender, mas os dois restantes ( async
, Async
) podem não ser :). Bem, ele deve fazer muito mais sentido para o compilador though.Further lê para mais tarde aqui
Então, existem 2 partes.
- Criar 'Tarefa'
- Crie açúcar sintático para chamar a tarefa (
await+async
)
Lembre-se, tivemos um chamador externo para AccessTheWebAsync () e esse chamador também não é poupado ... ou seja, ele também precisa do mesmo await+async
. E a cadeia continua. Mas sempre haverá um Task
em uma extremidade.
Tudo bem, mas um desenvolvedor ficou surpreso ao ver # 1 (Tarefa) ausente ...
Compartilhe a confusão de um desenvolvedor: 5 minutos
Um desenvolvedor cometeu um erro ao não implementar, Task
mas ainda funciona! Tente entender a pergunta e apenas a resposta aceita fornecida aqui . Espero que você tenha lido e compreendido completamente. O resumo é que podemos não ver / implementar a 'Tarefa', mas ela é implementada em algum lugar da classe pai. Da mesma forma, em nosso exemplo, chamar um já construído MethodAsync()
é muito mais fácil do que implementar esse método com um Task
( MethodTask()
). Muitos desenvolvedores acham difícil entender o processo de Tasks
conversão de um código para assíncrono.
Dica: Tente encontrar uma implementação Async existente (como MethodAsync
ou ToListAsync
) para terceirizar a dificuldade. Portanto, precisamos lidar apenas com o Async e aguardar (o que é fácil e bastante semelhante ao código normal)
Problema: Altere rapidamente uma implementação do código normal do mundo real para operação assíncrona: 2 minutos
A linha de código mostrada abaixo na Camada de Dados começou a quebrar (muitos lugares). Porque atualizamos alguns dos nossos códigos do .Net framework 4.2. * Para o .Net core. Tivemos que corrigir isso em 1 hora em todo o aplicativo!
var myContract = query.Where(c => c.ContractID == _contractID).First();
mole-mole!
- Instalamos o pacote de nuget EntityFramework porque ele possui QueryableExtensions. Ou, em outras palavras, faz a implementação assíncrona (tarefa), para que possamos sobreviver com código simples
Async
e simples await
.
- namespace = Microsoft.EntityFrameworkCore
linha de código de chamada mudou assim
var myContract = await query.Where(c => c.ContractID == _contractID).FirstAsync();
A assinatura do método foi alterada de
Contract GetContract(int contractnumber)
para
async Task<Contract> GetContractAsync(int contractnumber)
O método de chamada também foi afetado: GetContractAsync(123456);
foi chamado comoGetContractAsync(123456).Result;
Nós mudamos em todos os lugares em 30 minutos!
Mas o arquiteto nos disse para não usar a biblioteca EntityFramework apenas para isso! oops! drama! Em seguida, fizemos uma implementação de tarefa personalizada (yuk). Que você sabe como. Ainda é fácil! ..ainda yuk ..
Onde a próxima?
Há um vídeo rápido maravilhoso que poderíamos assistir sobre a conversão de chamadas síncronas em assíncronas no ASP.Net Core , talvez essa seja provavelmente a direção que se seguiria depois de ler isso.