CodeBlanks Logo Icon CodeBlanks

Bounded kanal

C# kursu · Uzman · Ders 34/47

Bounded kanalda backpressure ve WaitToWriteAsync öğrenirsin.

Bounded kanal ve backpressure

Bounded kanalda kapasite dolunca WriteAsync yer açılana kadar bekler; buna backpressure denir. Bu, üreticiyi tüketici hızına yavaşlatır ve bellek şişmesini önler.

WaitToWriteAsync() ise yazılabilir olana kadar bekler ve ValueTask<bool> döndürür. TryWrite ise beklemeden anında false döner; backpressure'ı senkron algılamanın yoludur.

BoundedChannelFullMode

BoundedChannelFullMode ile dolma davranışını seçersin: Wait (bekle, varsayılan), DropOldest (en eskiyi at), DropNewest (en yeniyi at), DropWrite (yazmayı at).

Örn. new BoundedChannelOptions(3) { FullMode = BoundedChannelFullMode.DropOldest } ile kanal dolduğunda en eski öğeyi atar. Log akışında eski kayıplar tolere edilebiliyorsa uygundur.

Uygulama Bounded kanalda TryWrite dene

Kapasitesi 2 olan bounded bir string kanalı yarat. channel.Writer.TryWrite ile üç öğe ("a", "b", "c") yaz ve her çağrının bool sonucunu Console.WriteLine ile yazdır. Üçüncü çağrı False döner çünkü kanal doludur.

Örnek çözümü göster
var channel = Channel.CreateBounded<string>(2); Sonra Console.WriteLine(channel.Writer.TryWrite("a")); Console.WriteLine(channel.Writer.TryWrite("b")); Console.WriteLine(channel.Writer.TryWrite("c"));
Örnek çözüm:
using System;
using System.Threading.Channels;

class Program
{
    static void Main()
    {
        var channel = Channel.CreateBounded<string>(2);
        Console.WriteLine(channel.Writer.TryWrite("a"));
        Console.WriteLine(channel.Writer.TryWrite("b"));
        Console.WriteLine(channel.Writer.TryWrite("c"));
    }
}

Kendini test et

  1. WaitToWriteAsync ne döndürür?

    • void
    • string
    • int
    • ValueTask<bool>
    Cevabı göster

    ValueTask<bool> — Doğru. WaitToWriteAsync ValueTask<bool> döndürür.

  2. FullMode davranışlarını eşleştir

    Wait
    Doluysa bekler
    DropOldest
    En eskiyi atar
    DropWrite
    Yazmayı sessizce atar
  3. WaitToWriteAsync koşulunu tamamla

    if (await channel.Writer.____) { channel.Writer.TryWrite("x"); }
    Cevabı göster
    if (await channel.Writer.WaitToWriteAsync()) { channel.Writer.TryWrite("x"); }

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