CodeBlanks Logo Icon CodeBlanks

Özet - Channels

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.

Başlangıç kodu

Program.cs
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>();
        // WriteAsync ile üç log yaz, Complete çağır
        // Döngü ile ReadAllAsync'ten oku, seviyeyi say
        // Alfabetik sırayla yazdır
    }
}

Örnek çözüm

Program.cs
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}");
        }
    }
}

Beklenen çıktı

ERROR: 1
INFO: 1
WARN: 1

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

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

Soru
await channel.Writer.____;
Cevap
await channel.Writer.WriteAsync("log: hata");

Açıklama: await WriteAsync logu kanala yazar.

2 Bir log işleyicide üretici ne yapar?

  • Logları okur
  • Logları kanala yazar Doğru cevap
  • Logları filtreler
  • Logları siler

Açıklama: Üretici logları kanala WriteAsync ile yazar.

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

Kavram Anlamı
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