muszę zmodyfikować istniejący program i zawiera następujący kod:asynchroniczny czekają w LINQ wybierz
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
Ale to wydaje się bardzo dziwne dla mnie, przede wszystkim wykorzystania async
i await
w select. Według this answer autorstwa Stephena Cleary powinienem móc je upuścić.
Następnie drugi Select
, który wybiera wynik. Czy to nie oznacza, że zadanie nie jest w ogóle asynchroniczne i jest wykonywane synchronicznie (tak wiele wysiłku za nic), czy zadanie będzie wykonywane asynchronicznie, a kiedy zostanie wykonane, wykonywane jest pozostałe zapytanie?
powinienem napisać powyższy kod jak następujących według another answer by Stephen Cleary:
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
i jest to zupełnie tak samo jak ten?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
a ja pracuję nad tym projektem chciałbym zmienić pierwszą próbkę kodu, ale nie jestem zbyt chętni na zmianę roboczą (podobno) 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) {...}
Jaki jest typ zwrotu ProceesEventAsync? – tede24
@ tede24 To 'Zadanie' z 'InputResult' jest niestandardową klasą. –
Twoje wersje są znacznie łatwiejsze do odczytania w mojej opinii. Jednak zapomniałeś "wybrać" wyniki z zadań przed swoim "Gdzie". – Max