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 awaitoperador 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 ? asyncawait Tasks
Como o aprendizado Taskabrange 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
Asynccomo 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 Taskem 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, Taskmas 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 Tasksconversão de um código para assíncrono.
Dica: Tente encontrar uma implementação Async existente (como MethodAsyncou 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
Asynce 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.