Necesito modificar un programa existente y contiene el siguiente código:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
Pero esto me parece muy extraño, en primer lugar, el uso de async
y await
en la selección. De acuerdo con esta respuesta por Stephen Cleary que debe ser capaz de soltar esos.
Luego el segundo Select
que selecciona el resultado. ¿No significa esto que la tarea no es asíncrona en absoluto y se realiza de forma sincrónica (tanto esfuerzo para nada), o la tarea se realizará de forma asincrónica y cuando se realiza el resto de la consulta se ejecuta?
¿Debo escribir el código anterior como el siguiente según otra respuesta de Stephen Cleary :
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
y es completamente igual a esto?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
Mientras estoy trabajando en este proyecto, me gustaría cambiar el primer ejemplo de código, pero no estoy demasiado interesado en cambiar (aparentemente trabajando) el código asíncrono. ¿Tal vez solo me estoy preocupando por nada y las 3 muestras de código hacen exactamente lo mismo?
ProcessEventsAsync tiene este aspecto:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
con InputResult
ser una clase personalizada.
Select
los resultados de las tareas anteriores a su Where
.
Result
propiedad de la tarea