Bounded kanal
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
-
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.
-
FullMode davranışlarını eşleştir
- Wait
- Doluysa bekler
- DropOldest
- En eskiyi atar
- DropWrite
- Yazmayı sessizce atar
-
WaitToWriteAsync koşulunu tamamla
if (await channel.Writer.____) { channel.Writer.TryWrite("x"); }Cevabı göster
if (await channel.Writer.WaitToWriteAsync()) { channel.Writer.TryWrite("x"); }