Мені потрібно змінити існуючу програму, яка містить такий код:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
Але це здається мені дуже дивним, в першу чергу використанням async
і await
у виборі. Відповідно до цієї відповіді Стівена Клірі, я мав би змогу їх відмовити.
Потім друга, Select
яка вибирає результат. Чи це не означає, що завдання зовсім не асинхронізується і виконується синхронно (стільки зусиль ні за що), чи завдання буде виконано асинхронно, і коли воно виконано, решта запиту буде виконана?
Чи повинен я написати вищевказаний код, як слід, відповідно до іншої відповіді Стівена Клірі :
var tasks = await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev)));
var inputs = tasks.Where(result => result != null).ToList();
і чи повністю він такий?
var inputs = (await Task.WhenAll(events.Select(ev => ProcessEventAsync(ev))))
.Where(result => result != null).ToList();
Хоча я працюю над цим проектом, я хотів би змінити перший зразок коду, але я не надто прагну змінити (помітно працюючи) код асинхронізації. Можливо, я просто переживаю за все, і всі 3 зразки коду роблять точно те саме?
ProcessEventsAsync виглядає так:
async Task<InputResult> ProcessEventAsync(InputEvent ev) {...}
Task<InputResult>
з InputResult
тим, щоб бути користувацьким класом.
Select
результати своїх завдань перед своїми Where
.
Result
властивості завдання