Мне нужно изменить существующую программу, и она содержит следующий код:
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) {...}
Task<InputResult>
с InputResult
того , чтобы быть пользовательский класс.
Select
результаты заданий перед вашими Where
.
Result
свойству задачи