А вы используете IAsyncEnumerable?



У меня сложилось впечатление, будто после релиза C# 8 про эту штуку все забыли, поэтому решил сегодня про неё вспомнить)



Этот тип данных решал задачу потребления и создания асинхронных потоков данных.



То есть, таких потоков, в которых данные получают или генерируют асинхронно.



Напомню, что если у нас есть некоторый метод:



static async IAsyncEnumerable<Data> GetData()

{

// ...

}




То в таком случае, можно перебрать возвращаемое значение следующим образом:



await foreach (var item in GetData())

{

// ...

}




Но что в таком случае будет наполнять тело метода GetData?



Обычно, асинхронные потоки удобны в том случае, когда данные представлены в виде набора батчей, но нам необходимо эмулировать целостность потока.



То есть, всё сразу предъявить мы не можем, но способны заявить об этой возможности.



Например, есть многостраничный список с фиксированным количеством элементов на одной странице.



Тогда, внутри метода GetData будет скачиваться одна страница и разворачиваться в плоский поток до тех пор, пока есть следующая страница:



static async IAsyncEnumerable<Data> GetData()

{

var page = 1;

while (page <= 10)

{

var items = await Fetch(page);

foreach (var item in items)

yield return item;

page++;

}

}




В вашей практике встречается потребность в IAsyncEnumerable?