CodeBlanks Logo Icon CodeBlanks

Kanal tamamlama

C# kursu · Uzman · Ders 35/47

Channel.Writer.Complete ve Completion ile kanalı kapatmayı öğrenirsin.

Kanal tamamlama

Writer.Complete(), kanala artık öğe gelmeyeceğini bildirir. Tüketici, kalan öğeleri okuduktan sonra ReadAllAsync akışı zarif biçimde sonlanır.

Reader.Completion ise bir Task'tır; kanal tamamen bittiğinde tamamlanır. Bekleyen tüketici bununla sonlanabilir. Hata ile kapatmak için Writer.TryComplete(exception) kullanılır. Bu, akışta bir üretim hatasını tüketiciye iletmeyi sağlar.

Zarif kapanış

Üretici Writer.Complete() çağırdıktan sonra, await foreach (var item in channel.Reader.ReadAllAsync()) döngüsü kalan öğeleri tüketir ve sonra biter. Bu, kanalı kapatırken veri kaybı olmadığını garanti eder.

Tüketici tarafta await channel.Reader.Completion ile kanalın tamamen bittiğini bekleyebilirsin; özellikle birden çok kanalı senkronize ederken yararlıdır.

Uygulama Complete ile akışı kapat

channel sınırsız bir string kanalıdır. await channel.Writer.WriteAsync ile üç öğe ("a", "b", "c") yaz. Sonra channel.Writer.Complete() çağır. En son await foreach (var item in channel.Reader.ReadAllAsync()) ile tüm öğeleri yazdır. Main metodunu async Task yap.

Örnek çözümü göster
Üç kez await channel.Writer.WriteAsync(...) çağır, channel.Writer.Complete(); çağır, sonra await foreach (var item in channel.Reader.ReadAllAsync()) 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");
        channel.Writer.Complete();
        await foreach (var item in channel.Reader.ReadAllAsync())
        {
            Console.WriteLine(item);
        }
    }
}

Kendini test et

  1. Tamamlama metotlarını eşleştir

    Writer.Complete()
    Yazmayı bitir
    Reader.Completion
    Kanalın bitiş Task'ı
    TryComplete(exception)
    Hata ile kapat
  2. Complete çağrısını tamamla

    channel.Writer.____;
    Cevabı göster
    channel.Writer.Complete();
  3. Kanala artık öğe yazılmayacağını bildirmek için hangi metot çağrılır?

    • Writer.Complete()
    • Writer.Close()
    • Writer.Finish()
    • Reader.Complete()
    Cevabı göster

    Writer.Complete() — Doğru. Writer.Complete() yazmayı bitirir.

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