C#
Ö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.
Ö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
-
WriteAsync çağrısını tamamla
await channel.Writer.____;
Cevabı göster
await channel.Writer.WriteAsync("log: hata");
-
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.
-
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
Sıradaki ders: Source generator nedir?