System.Threading.Channels
Channel<T> ile üretici-tüketici akışını öğrenirsin.
System.Threading.Channels nedir?
System.Threading.Channels, üretici-tüketici (producer-consumer) senaryoları için kullanışlı bir yapıdır. Bir kanal (channel) üreticinin yazdığı öğeleri kuyruğa alır; tüketici sırayla okur. Üretim ve tüketim farklı hızlarda olabilir.
Kanal oluşturma: var channel = Channel.CreateUnbounded<int>();. Sınırsız kanal tüm öğeleri kabul eder. Sınırlı kanal için CreateBounded<int>(10) yazılır; bu, en fazla 10 öğe tutar. Üretici channel.Writer.WriteAsync(...); tüketici channel.Reader.ReadAsync() kullanır.
Producer/Consumer
Üretici kanala yazarken tüketici paralel okur. Üretici await channel.Writer.WriteAsync(item);; tüketici var item = await channel.Reader.ReadAsync();. Üretici bitince channel.Writer.Complete(); çağrılır.
Tüketici kanal boşsa ve writer Complete ise okuma döngüsünden çıkar. Bu, eş-zamanlı iş kuyruğu kurmanın temiz yoludur. WaitToReadAsync ile öğe gelene dek beklenebilir.
Uygulama Channel ile üretici-tüketici
Main'i static async Task Main yap. var channel = Channel.CreateUnbounded<int>(); ile kanal oluştur. await channel.Writer.WriteAsync(10); ve await channel.Writer.WriteAsync(20); ile iki öğe yaz. channel.Writer.Complete(); ile yazmayı bitir. int sum = 0; await foreach (int n in channel.Reader.ReadAllAsync()) { sum += n; } ile tüm öğeleri topla, Console.WriteLine(sum); ile yazdır.
Örnek çözümü göster
Main'i static async Task Main() yapıp var channel = Channel.CreateUnbounded<int>(); await channel.Writer.WriteAsync(10); await channel.Writer.WriteAsync(20); channel.Writer.Complete(); int sum = 0; await foreach (int n in channel.Reader.ReadAllAsync()) { sum += n; } Console.WriteLine(sum);
Örnek çözüm:
using System;
using System.Collections.Generic;
using System.Threading.Channels;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
var channel = Channel.CreateUnbounded<int>();
await channel.Writer.WriteAsync(10);
await channel.Writer.WriteAsync(20);
channel.Writer.Complete();
int sum = 0;
await foreach (int n in channel.Reader.ReadAllAsync())
{
sum += n;
}
Console.WriteLine(sum);
}
}
Kendini test et
-
Channel oluştur
var channel = Channel.____<int>();Cevabı göster
var channel = Channel.CreateUnbounded<int>(); -
Channels ne zaman kullanılır?
- Yalnızca tek parçacıklı kodda
- Sync foreach yerine
- Exception yakalamak için
- Üretici ve tüketici farklı hızlarda çalıştığında
Cevabı göster
Üretici ve tüketici farklı hızlarda çalıştığında — Doğru. Channels üretici-tüketici senaryoları için idealdir.
-
Channel kavramlarını eşleştir
- Channel.CreateUnbounded
- Sınırsız kanal
- Writer.WriteAsync
- Öğe yazar
- Reader.ReadAsync
- Öğe okur
- Writer.Complete
- Yazmayı bitirir