Muszę zmodyfikować istniejący program i zawiera następujący kod:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
Ale wydaje mi się to bardzo dziwne, przede wszystkim użycie async
i await
w selekcji. Zgodnie z tą odpowiedzią Stephena Cleary'ego powinienem móc je odrzucić.
Następnie drugi, Select
który wybiera wynik. Czy nie oznacza to, że zadanie nie jest w ogóle asynchroniczne i jest wykonywane synchronicznie (tyle wysiłku na nic), czy też będzie wykonywane asynchronicznie, a po zakończeniu reszta zapytania zostanie wykonana?
Czy powinienem napisać powyższy kod jak poniżej według innej odpowiedzi Stephena Cleary :
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
i czy jest zupełnie tak samo?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
Kiedy pracuję nad tym projektem, chciałbym zmienić pierwszy przykład kodu, ale nie jestem zbyt chętny do zmiany (najwyraźniej działającego) kodu asynchronicznego. Może po prostu martwię się o nic, a wszystkie 3 próbki kodu robią dokładnie to samo?
ProcessEventsAsync wygląda następująco:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
o to, InputResult
że jest to klasa niestandardowa.
Select
o wynikach zadań wykonanych wcześniej Where
.
Result
właściwości zadania