Devo modificare un programma esistente e contiene il seguente codice:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
Ma questo mi sembra molto strano, prima di tutto l'uso di async
e await
nella selezione. Secondo questa risposta di Stephen Cleary dovrei riuscire a lasciar perdere.
Quindi il secondo Select
che seleziona il risultato. Questo non significa che l'attività non è affatto asincrona e viene eseguita in modo sincrono (così tanto sforzo per nulla), oppure l'attività verrà eseguita in modo asincrono e al termine verrà eseguita la parte restante della query?
Dovrei scrivere il codice sopra come segue secondo un'altra risposta di Stephen Cleary :
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
ed è completamente uguale a questo?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
Mentre sto lavorando a questo progetto mi piacerebbe cambiare il primo esempio di codice ma non sono troppo entusiasta di cambiare il codice asincrono (apparentemente funzionante). Forse mi sto solo preoccupando per niente e tutti e 3 gli esempi di codice fanno esattamente la stessa cosa?
ProcessEventsAsync è simile al seguente:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
con InputResult
essendo una classe personalizzata.
Select
i risultati delle attività precedenti al tuo Where
.
Result
proprietà dell'attività