по именам файлов найти их, и вернуть стримы из них. На выходе должен получиться список стримов. Каждый отдельный поток я получаю через метод, возвращающий Task<Stream>.
Кажется, сюда напрашивается AsyncEnumerable, но я что-то не понимаю как мне его заюзать.
Вот такой вариант ниже - он же не имеет смысла, так?
async IAsyncEnumerable<Stream> GetStreams(List<string> paths) {
foreach (var path in paths) {
yield return await fileService.GetStream(path);
}
}
Проще говоря, у меня есть метод A -> Task<B>, как мне с его использованием получить метод IEnumerable<A> -> IAsyncEnumerable<B>?
await foreach (var item in iAsyncEnumerable<Collection>) yield return item;
Нашёл такой вариант: public static async IAsyncEnumerable<T> ParallelEnumerateAsync<T>( this IEnumerable<Task<T>> tasks) { var remaining = new List<Task<T>>(tasks); while (remaining.Count != 0) { var task = await Task.WhenAny(remaining); remaining.Remove(task); yield return (await task); } } Вопрос закрыт, если никто не захочет ничего добавить.
У меня на входе нет async enumerable. Мне его самому нужно сделать. Пример который мне вроде подходит выше.
remaining.Remove(task); - выглядит не очень тредсейф
Из-за when any там не будет нескольких потоков
Этот код не гарантирует порядка исходного IEnumerable, если это для вас важно
Нет, это не важно.
Кажется от parallel enumerate это вообще не ожидается
Ну мааааало ли. В PLINQ, например, есть опция порядок сохранять
да.
А зачем для этой задачи async?🙂
Обсуждают сегодня