É bom passar parâmetros com await? quais são os prós e os contras de fazer isso?
var results = MapResults(await GetDataAsync());
var result = await GetDataAsync(); var map = MapResults(result)
É bom passar parâmetros com await? quais são os prós e os contras de fazer isso?
var results = MapResults(await GetDataAsync());
var result = await GetDataAsync(); var map = MapResults(result)
Respostas:
ATUALIZAÇÃO: Esta questão foi o assunto do meu blog em março de 2020 . Veja-o para mais discussões sobre esta questão. Obrigado pela pergunta interessante!
Vou assumir aqui que você pretendia que fosse uma chamada de função como o único membro da lista de argumentos.
Como outros observaram, não há diferença entre
x = M(await FAsync());
e
var f = await FAsync();
x = M(f);
E isso é o mesmo que
var ftask = FAsync();
x = M(await ftask)
Portanto, não importa como você escreve, correto?
Pense nisso.
Nesse cenário específico , todos os três fluxos de trabalho são iguais. Mas há uma diferença potencial aqui se apenas variarmos ligeiramente o cenário. Considerar:
x = M(await FAsync(), await GAsync());
É o mesmo que
var f = await FAsync();
var g = await GAsync();
x = M(f, g);
e o que sabemos sobre esse fluxo de trabalho? A tarefa do GAsync não é iniciada até que a tarefa do FAsync seja concluída! Mas parece que há uma oportunidade de ter duas tarefas acontecendo ao mesmo tempo aqui, que podem usar o encadeamento atual com mais eficiência! Provavelmente, o fluxo de trabalho seria melhor escrito como:
var ftask = FAsync();
var gtask = GAsync();
x = M(await ftask, await gtask);
Agora, as tarefas FAsync e GAsync são iniciadas e não chamamos M até que ambas terminem.
Meu conselho é pensar cuidadosamente sobre onde você espera. Lembre-se de que uma espera é um ponto em um fluxo de trabalho assíncrono em que o fluxo de trabalho é interrompido de forma assíncrona até que uma condição prévia da continuação seja atendida . Se você pode adiar a espera de uma tarefa até que ela seja realmente uma pré-condição, poderá conseguir uma vitória no desempenho.
SqlConnectionou DbContextpor exemplo.
Não há diferença de tempo de execução entre;
var results = MapResults(await GetDataAsync())
e
var tmp = await GetDataAsync();
var results = MapResults(tmp)
GetDataAsync) e não a chamada de método. Dependendo de onde isso Task GetDataAsync = CallSomeAsync()foi inicializado, pode haver diferenças significativas, pois a tarefa já estará em execução quando o tempo MapResults(await GetDataAsync)for chamado. Veja a resposta de Eric para mais detalhes.