CodeBlanks Logo Icon CodeBlanks

Özet - Async streams

C# kursu · İleri seviye · Ders 24/83

IAsyncEnumerable, await foreach ve Channel'ı birleştirerek bir log akışı yazarsın.

Özet - Async streams

Bu grupta async akışların temellerini öğrendin: IAsyncEnumerable<T> async değer akışı üretir; await foreach ile tüketilir; yield return ile öğe üretilir. CancellationToken ile akış iptal edilir; System.Threading.Channels ile üretici-tüketici kuyruğu kurulur.

En önemli ders: büyük veriyi tek seferde değil, parça parça akıt. Bu, bellek kullanımını düşürür ve gecikmeyi azaltır. Şimdi tüm bunları birleştiren bir uygulama yazacağız.

Uygulama IAsyncEnumerable + cancellation birleştir

static async IAsyncEnumerable<int> Squares(CancellationToken token) metodunu tanımla. Gövdede for (int i = 1; i <= 3; i++) döngüsü aç; her adımda token.ThrowIfCancellationRequested();, await Task.CompletedTask; ve yield return i * i; yap. Main'i static async Task Main yap; var cts = new CancellationTokenSource(); ile kaynak oluştur (iptal etme). int sum = 0; await foreach (int n in Squares(cts.Token)) { sum += n; } ile topla, Console.WriteLine(sum); ile yazdır.

Örnek çözümü göster
Squares gövdesinde for (int i = 1; i <= 3; i++) { token.ThrowIfCancellationRequested(); await Task.CompletedTask; yield return i * i; } yaz. Main'i static async Task Main() yapıp var cts = new CancellationTokenSource(); int sum = 0; await foreach (int n in Squares(cts.Token)) { sum += n; } Console.WriteLine(sum);
Örnek çözüm:
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async IAsyncEnumerable<int> Squares(CancellationToken token)
    {
        for (int i = 1; i <= 3; i++)
        {
            token.ThrowIfCancellationRequested();
            await Task.CompletedTask;
            yield return i * i;
        }
    }

    static async Task Main()
    {
        var cts = new CancellationTokenSource();
        int sum = 0;
        await foreach (int n in Squares(cts.Token))
        {
            sum += n;
        }
        Console.WriteLine(sum);
    }
}

İpuçları

Birkaç ipucu: büyük veriyi IAsyncEnumerable ile akıt; tüm listeyi beklemekten kaçın. Her async akışa CancellationToken parametresi ekle ve her öğeden önce ThrowIfCancellationRequested çağır.

Üretici-tüketici için System.Threading.Channels kullan; üretim ve tüketim hızları farklıysa idealdir. await foreach tüketicinin standart aracıdır; yield return üreticinin standart aracıdır.

Uygulama Mini uygulama: Katları akıt

static async IAsyncEnumerable<int> MultiplesOf(int k, CancellationToken token) metodunu tanımla. Gövdede for (int i = 1; i <= 4; i++) döngüsü aç; her adımda token.ThrowIfCancellationRequested();, await Task.CompletedTask; ve yield return k * i; yap. Main'i static async Task Main yap; var cts = new CancellationTokenSource(); ile kaynak oluştur. int sum = 0; await foreach (int n in MultiplesOf(5, cts.Token)) { sum += n; } ile topla, Console.WriteLine(sum); ile yazdır (5+10+15+20 = 50).

Örnek çözümü göster
MultiplesOf gövdesinde for (int i = 1; i <= 4; i++) { token.ThrowIfCancellationRequested(); await Task.CompletedTask; yield return k * i; } yaz. Main'i static async Task Main() yapıp var cts = new CancellationTokenSource(); int sum = 0; await foreach (int n in MultiplesOf(5, cts.Token)) { sum += n; } Console.WriteLine(sum);
Örnek çözüm:
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static async IAsyncEnumerable<int> MultiplesOf(int k, CancellationToken token)
    {
        for (int i = 1; i <= 4; i++)
        {
            token.ThrowIfCancellationRequested();
            await Task.CompletedTask;
            yield return k * i;
        }
    }

    static async Task Main()
    {
        var cts = new CancellationTokenSource();
        int sum = 0;
        await foreach (int n in MultiplesOf(5, cts.Token))
        {
            sum += n;
        }
        Console.WriteLine(sum);
    }
}

Kendini test et

  1. IAsyncEnumerable'ı tüketen deyim hangisi?

    • await foreach
    • for
    • while
    • lock
    Cevabı göster

    await foreach — Doğru. await foreach IAsyncEnumerable'ı tüketir.

İleri seviye bölümündeki tüm dersler