
Как стримить данные в ASP.NET и как их принять
Indermove только что Как стримить данные в ASP.NET и как их принять Средний 10 мин 1 .NET * C# * Проектирование API * Программирование * Туториал Недавно мне попалась отличная статья про IAsyncEnumerable и стриминг...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
В сфере искусственного интеллекта произошло заметное событие. Indermove только что Как стримить данные в ASP. NET и как их принять Средний 10 мин 1 . NET * C# * Проектирование API * Программирование * Туториал Недавно мне попалась отличная статья про IAsyncEnumerable и стриминг данных.
В ней у автора упал прод, который пытался выдать 500 000 записей разом и упал на вызове ToListAsync() с OOM при 8 ГБ RAM. Далее в статье описывается, как все это стримить с помощью IAsyncEnumerable с примерами кода. В целом после прочтения статьи может сложиться впечатление, что все свои ToListAsync() срочно нужно убрать и заменить на стриминг.
Технические детали
Но со времен появления стримингового апи мне всегда было скорее интересно:Как отдавать стримы на фронтенд? В каких случаях это стоит делать? Как их принимать на фронтенде?
Но руки до этих вопросов упорно не доходили, а статья послужила эдаким триггером к изучению, результатами которого я и хочу поделиться. Как стриминг работает: концепцияДля начала — в чем вообще идея стриминга данных и почему он действительно может помогать экономить память в сравнении с ToListAsync()? Возьмем, к примеру, вот такой код:app.
MapGet("/articles", async (KbContext db, CancellationToken ct) => Results. ToListAsync(ct)));Когда вы делаете ToListAsync(), то в памяти это иллюстративно выглядит вот так:Картинка 1: как ToListAsync работает с памятью процессаСначала копируем все 500 000 записей из БД в память процесса. А затем отдаем клиенту в сокет.
Отраслевые последствия
По итогу мы уже, вроде, отдали клиенту все, что надо, и то, что осталось в памяти процесса — нам больше не нужно. Но оно раздуло нам память, и будет висеть там до следующей сборки мусора. Стриминг в этом плане выглядит куда более интересно.
Вы перекачиваете записи по одной и отдаете в сокет. Например, достали одну запись и положили к себе в память, а затем — отдали клиенту. Взяли следующую — и так далее.
Картинка 2: Как стриминг работает с памятью процессаНо как добиться того, чтобы отдача шла по одной записи, а не огромной пачкой по 500 000 объектов за раз? Способ 1: отдавать IAsyncEnumerable напрямуюСамый ленивый стриминг. NET Core умеет сериализовать IAsyncEnumerable как стриминговый JSON-массив — System.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





