ho bisogno di modificare un programma esistente e contiene codice seguente:Async attendono in LINQ selezionare
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
Ma questo sembra molto strano per me, prima di tutto l'uso di async
e await
nella select. Secondo this answer di Stephen Cleary dovrei essere in grado di lasciar perdere.
Quindi il secondo Select
che seleziona il risultato. Questo non significa che l'attività non è asincrona e viene eseguita in modo sincrono (così tanto sforzo per nulla), o l'attività verrà eseguita in modo asincrono e quando viene eseguita viene eseguito il resto della query?
Devo scrivere il codice precedente come segue in base al another answer by Stephen Cleary:
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
ed è completamente lo stesso come questo?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
mentre sto lavorando su questo progetto mi piacerebbe cambiare il primo esempio di codice, ma io non sono troppo appassionato di cambiare (apparantly di lavoro) del codice asincrono. Forse mi sto solo preoccupando di nulla e tutti e 3 i campioni di codice fanno esattamente la stessa cosa?
ProcessEventsAsync assomiglia a questo:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Qual è il tipo di reso di ProceesEventAsync? – tede24
@ tede24 È 'Task' con 'InputResult' che è una classe personalizzata. –
Secondo me le tue versioni sono molto più facili da leggere. Tuttavia, ci si è dimenticati di selezionare i risultati dalle attività prima di 'Dove'. – Max