CodeBlanks Logo Icon CodeBlanks

Özet - Channels

C# kursu · Uzman · Ders 36/47

ChannelWriter, ChannelReader ve Complete'i birleştirerek bir log işleyici yazarsın.

Özet - Channels

Bu özette bir log işleyici yazacaksın. Üretici logları kanala yazar ve Complete ile kapatır; tüketici ReadAllAsync ile her logu okur, seviyesine göre ayırır ve sayar.

Önceki derslerde gördüğümüz CreateUnbounded, WriteAsync, Complete, ReadAllAsync ve OrderBy burada bir araya gelir. Tek iş parçacıklı async akış çıktıyı deterministik tutar.

Log işleyici tasarımı

Üretici üç log yazar: "INFO: başladı", "WARN: yavaş", "ERROR: hata". Sonra Complete çağrılır. Tüketici await foreach ile her logu okur, Split(':')[0] ile seviye adını çıkarır ve bir Dictionary'de sayar.

Sonuçlar OrderBy(k => k.Key) ile alfabetik yazdırılır. Seviyeler farklı olduğu için her birinin sayısı 1 olur.

Uygulama Log işleyiciyi birleştir

channel sınırsız bir string kanalıdır. await channel.Writer.WriteAsync ile üç log yaz: "INFO: başladı", "WARN: yavaş", "ERROR: hata". channel.Writer.Complete() çağır. Bir Dictionary<string, int> içinde await foreach (var log in channel.Reader.ReadAllAsync()) ile her logun seviyesini (log.Split(':')[0]) say. Sonra OrderBy(k => k.Key) ile $"{kvp.Key}: {kvp.Value}" yazdır. Main async Task olsun.

Örnek çözümü göster
')[0]] = counts.GetValueOrDefault(...) + 1 yap. OrderBy(k => k.Key) ile yazdır.
Örnek çözüm:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Channels;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var channel = Channel.CreateUnbounded<string>();
        var counts = new Dictionary<string, int>();
        await channel.Writer.WriteAsync("INFO: başladı");
        await channel.Writer.WriteAsync("WARN: yavaş");
        await channel.Writer.WriteAsync("ERROR: hata");
        channel.Writer.Complete();
        await foreach (var log in channel.Reader.ReadAllAsync())
        {
            var level = log.Split(':')[0];
            counts[level] = counts.GetValueOrDefault(level) + 1;
        }
        foreach (var kvp in counts.OrderBy(k => k.Key))
        {
            Console.WriteLine($"{kvp.Key}: {kvp.Value}");
        }
    }
}

Kendini test et

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

    await channel.Writer.____;
    Cevabı göster
    await channel.Writer.WriteAsync("log: hata");
  2. Bir log işleyicide üretici ne yapar?

    • Logları okur
    • Logları filtreler
    • Logları kanala yazar
    • Logları siler
    Cevabı göster

    Logları kanala yazar — Doğru. Üretici logları kanala WriteAsync ile yazar.

  3. Log işleyici adımlarını eşleştir

    CreateUnbounded
    Kanalı oluştur
    Writer.WriteAsync
    Log üret
    Writer.Complete
    Üretimi bitir
    Reader.ReadAllAsync
    Logları tüket

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