Özet - Channels
- C# kursu
- Uzman
- Ders 36/47
- 5 dk
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
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
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
await channel.Writer.____;
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 |