Preciso modificar um programa existente e ele contém o seguinte código:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
Mas isso me parece muito estranho, antes de tudo, o uso de async
e await
no select. De acordo com esta resposta de Stephen Cleary, eu deveria ser capaz de abandoná-las.
Então o segundo Select
que seleciona o resultado. Isso não significa que a tarefa não é assíncrona e é executada de forma síncrona (muito esforço por nada) ou será executada de forma assíncrona e quando concluída, o restante da consulta é executado?
Devo escrever o código acima como segue, de acordo com outra resposta de Stephen Cleary :
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
e é completamente o mesmo assim?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
Enquanto estou trabalhando neste projeto, gostaria de alterar o primeiro exemplo de código, mas não estou muito interessado em alterar (aparentemente trabalhando) código assíncrono. Talvez eu esteja apenas me preocupando por nada e todos os três exemplos de código façam exatamente a mesma coisa?
ProcessEventsAsync tem esta aparência:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
como InputResult
ser uma classe personalizada.
Select
os resultados das tarefas anteriores à sua Where
.
Result
propriedade da tarefa #