Streaming Asincron cu IAsyncEnumerable în C# în C# (.NET)

Programare Asincronă și Reactive C# 8 / .NET Core 3.0+

Consumul și emiterea fluxurilor continue de date pe măsură ce sosesc de la rețea sau baze de date, fără a aștepta încărcarea întregii liste în memorie.

Sintaxă C#
async IAsyncEnumerable<T> Metoda() { yield return ... }

În mod tradițional, când o metodă asincronă returna o listă de date (`Task>`), aplicația client trebuia să aștepte ca toate cele 10.000 de înregistrări să fie descărcate și încărcate în memorie înainte de a putea procesa primul rând.

Interfața IAsyncEnumerable<T> aduce conceptul de Streaming Asincron nativ în C#. Combină modelul iteratorilor `yield return` cu execuția non-blocantă `await`.

Producătorul emite fiecare element de date imediat ce a fost citit de la serverul SQL sau din fluxul API, iar consumatorul îl procesează instantaneu printr-o buclă await foreach. Este tipul ideal pentru streaming-ul de tokeni de la modele LLM sau exportul rapoartelor gigantice de baze de date.

Sintaxă, opțiuni și concepte cheie

Opțiune / Concept Descriere practică
IAsyncEnumerable Interfața oficială ce permite iterarea asincronă peste o secvență continuă de elemente.
await foreach (var item in stream) Construcția de limbaj ce consumă elementele pe măsură ce devin disponibile.
yield return valoare Emite următorul element din flux și suspendă execuția până când consumatorul cere următorul rând.
[EnumeratorCancellation] Atributul ce permite propagarea corectă a tokenului de anulare (`CancellationToken`).

Exemple practice și cod

Exemplul 1: Streaming de tokeni dintr-un API AI în timp real cu IAsyncEnumerable

Cum se generează și se consumă un flux asincron continuu.

// 1. Metoda producător care emite date pe măsură ce sosesc din rețea:
public static async IAsyncEnumerable StreamChatAsync([EnumeratorCancellation] CancellationToken ct = default)
{
    string[] cuvinte = ["Inteligența", "artificială", "avansează", "la", "viteze", "uimitoare."];
    foreach (var cuvant in cuvinte)
    {
        await Task.Delay(200, ct); // Simulăm latența de rețea între tokeni
        yield return cuvant + " ";
    }
}

// 2. Metoda consumator care afișează fiecare cuvânt instantaneu:
await foreach (var token in StreamChatAsync())
{
    Console.Write(token); // Textul curge pe ecran fluid!
}

Rezultat & Impact

Utilizatorul vede primele rezultate imediat fără nicio întârziere resimțită.

Greșeli frecvente și bune practici

  • Omiterea parametrului `CancellationToken` la metodele care generează `IAsyncEnumerable`, făcând imposibilă oprirea streaming-ului dacă utilizatorul apasă butonul ‘Stop’.
  • Apelarea metodei `ToList()` pe un `IAsyncEnumerable`, forțând așteptarea întregului flux și anulând complet beneficiul de streaming.

Ghiduri și noțiuni înrudite