CodeBlanks Logo Icon CodeBlanks

ChannelReader

C# kursu · Uzman · Ders 33/47

ChannelReader<T> ile kanaldan okumayı öğrenirsin.

ChannelReader<T>

ChannelReader<T>, kanalın tüketici yüzüdür. ReadAsync() tek öğeyi zaman uyumsuz okur; kanal boşsa ve tamamlanmadıysa bekler. TryRead(out T item) anında dener.

ReadAllAsync() ise bir IAsyncEnumerable<T> döndürür; await foreach ile kanal tamamlanana kadar tüm öğeleri akıtırsın. Bu, en yaygın tüketim desenidir.

await foreach ile tüket

await foreach (var item in channel.Reader.ReadAllAsync()) kalıbı, kanaldan tüm öğeleri sırayla tüketir. Kanal tamamlanınca (Writer.Complete()) döngü zarif biçimde sonlanır.

Bu, üretici-tüketici akışında kaybolan öğe olmamasını sağlar. Döngü gövdesinde öğeyi işler, filtreler veya bir koleksiyona eklersin. Tamamlanmamış bir kanalda döngü, yeni öğeler geldikçe devam eder.

Uygulama Yaz ve oku

channel sınırsız bir string kanalıdır. await channel.Writer.WriteAsync ile üç öğe yaz ("a", "b", "c"). Sonra for döngüsünde üç kez await channel.Reader.ReadAsync() ile okuyup her öğeyi yazdır. Main metodunu async Task yap.

Örnek çözümü göster
Üç kez await channel.Writer.WriteAsync(...) çağır. Sonra for (int i = 0; i < 3; i++) { var item = await channel.Reader.ReadAsync(); Console.WriteLine(item); }
Örnek çözüm:
using System;
using System.Threading.Channels;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var channel = Channel.CreateUnbounded<string>();
        await channel.Writer.WriteAsync("a");
        await channel.Writer.WriteAsync("b");
        await channel.Writer.WriteAsync("c");
        for (int i = 0; i < 3; i++)
        {
            var item = await channel.Reader.ReadAsync();
            Console.WriteLine(item);
        }
    }
}

Kendini test et

  1. ReadAsync çağrısını tamamla

    var item = await channel.Reader.____;
    Cevabı göster
    var item = await channel.Reader.ReadAsync();
  2. Okuma metotlarını eşleştir

    ReadAsync
    Tek öğe zaman uyumsuz oku
    TryRead
    Anında dene, bool döndür
    ReadAllAsync
    Tüm akışı oku
  3. ChannelReader ile tüm öğeleri akış olarak okumak için hangi metot kullanılır?

    • ReadAll
    • ReadAllAsync
    • ReadEverything
    • ReadStream
    Cevabı göster

    ReadAllAsync — Doğru. ReadAllAsync tüm akışı döndürür.

Uzman bölümündeki tüm dersler