Мне нужно изменить существующую программу и содержать следующий код:
var inputs = events.Select(async ev => await ProcessEventAsync(ev))
.Select(t => t.Result)
.Where(i => i != null)
.ToList();
Но это кажется мне очень странным, прежде всего, использование async
и await
в select. В соответствии с этим ответом Стивеном Клири я должен уметь их отбросить.
Затем второй 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) {...}