По существу я пытаюсь быть в состоянии сделать это:Возможно ли вернуть список асинхронных элементов в асинхронном методе из источника async?
var thingTasks = thingFactory.GetMyThings();
// ...
var things = await thingTasks;
Я пытаюсь запустить из списка объектов, перебирать этот список, сделав async
вызов для каждого из них, и возвращает набор приводит к await
-способен, так что потребитель может выбрать, когда до await
. GetMyThings
сам использует await
перед формированием списка, поэтому он должен быть async
сам и что-то вроде:
public async Task<List<Thing>> GetMyThings() {
var thingMakers = await GetThingMakers();
var things = thingMakers.Select(async thing => await thing.GetAsync());
return things;
}
Основная идея заключается в том, что у меня есть некоторые await
линии, то после этого я использую результаты этих линий генерировать список и генерировать каждый элемент также требует вызова async
. Я пытаюсь избежать блокировки внутри метода (например, .Result
) и вместо этого передать эту ответственность/возможность обратно вызывающему абоненту. В основном, запустите задачи в списке, но не await
. Это, естественно, заставляет меня хотеть вернуть Task<List<Thing>>
или «List>».
Ближайший я получил return Task.WhenAll(things)
, но это не сработало (это должно было быть Task<Task<Thing[]>>
и await await GetMyThings()
. С другой стороны, return Select(...)
возвращающая Task<List<Task<Thing>>>
и нуждающихся в await Task.WhenAll(await GetMyThings())
на потребляющей стороне.
В обоих случаях нужно дважды await
заявления, чтобы реализовать этот список. Я имею в виду, что это невозможно, но есть способ, чтобы избежать двойного await
?
'асинхронной вещь => ждут thing.GetAsync()' 'просто вещь => thing.GetAsync() ', который также совпадает с' GetAsync'. Не нужно излишне обертывать его. – Servy
Если вы не хотите, чтобы вызывающий вызывал необходимость разворачивать результаты, сначала попросите метод развернуть результаты перед их возвратом. Метод может развернуть результаты точно так же, как вы это делали. – Servy