Î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.