CodeBlanks Logo Icon CodeBlanks

System.Threading.Channels

C# kursu · İleri seviye · Ders 23/83

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

  1. Channel oluştur

    var channel = Channel.____<int>();
    Cevabı göster
    var channel = Channel.CreateUnbounded<int>();
  2. 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.

  3. 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

İleri seviye bölümündeki tüm dersler