CodeBlanks Logo Icon CodeBlanks

Özet - Concurrent koleksiyonlar

C# kursu · Uzman · Ders 30/47

ConcurrentDictionary ve BlockingCollection'ı birleştirerek bir iş kuyruğu yazarsın.

Özet - Concurrent koleksiyonlar

Bu özette ConcurrentDictionary ve BlockingCollection'ı birleştirerek küçük bir iş kuyruğu yazacaksın. Üretici görevleri engellemeli kuyruğa ekler, tüketici onları çıkarıp ConcurrentDictionary'de sayar.

Önceki beş derste gördüğümüz GetOrAdd, Add, CompleteAdding, GetConsumingEnumerable ve OrderBy burada birlikte çalışacak. Tek iş parçacıklı tutmak çıktıyı deterministik tutar.

İş kuyruğu tasarımı

Üretici work adlı bir BlockingCollection<string>'a üç görev ekler ve CompleteAdding çağırır. Tüketici GetConsumingEnumerable ile her görevi alır ve results.GetOrAdd(item, item.Length) ile adını uzunluğuyla sözlüğe koyar.

Sonuçları OrderBy(k => k.Key) ile alfabetik yazdırırsın. Bu, üretici-tüketici ve sözlük desenini bir arada gösterir.

Uygulama İş kuyruğunu birleştir

work bir BlockingCollection<string>, results bir ConcurrentDictionary<string, int>'tir. work'e "elma", "muz", "kiraz" ekle ve CompleteAdding çağır. GetConsumingEnumerable ile her öğeyi results.GetOrAdd(item, item.Length)'le sözlüğe koy. Sonra OrderBy(k => k.Key) ile $"{kvp.Key}: {kvp.Value}" yazdır.

Örnek çözümü göster
work.Add ile üç öğe ekle, CompleteAdding çağır. GetConsumingEnumerable ile results.GetOrAdd(item, item.Length) yap. OrderBy(k => k.Key) ile yazdır.
Örnek çözüm:
using System;
using System.Collections.Concurrent;
using System.Linq;

class Program
{
    static void Main()
    {
        var work = new BlockingCollection<string>();
        var results = new ConcurrentDictionary<string, int>();
        work.Add("elma");
        work.Add("muz");
        work.Add("kiraz");
        work.CompleteAdding();
        foreach (var item in work.GetConsumingEnumerable())
        {
            results.GetOrAdd(item, item.Length);
        }
        foreach (var kvp in results.OrderBy(k => k.Key))
        {
            Console.WriteLine($"{kvp.Key}: {kvp.Value}");
        }
    }
}

Kendini test et

  1. Koleksiyonu rolüyle eşleştir

    ConcurrentDictionary
    İş parçacığı güvenli sözlük
    ConcurrentQueue
    İş parçacığı güvenli FIFO
    BlockingCollection
    Üretici-tüketici engelleme
  2. Bir iş kuyruğunda üretici-tüketici için en uygun koleksiyon hangisidir?

    • ConcurrentDictionary
    • ConcurrentBag
    • ConcurrentStack
    • BlockingCollection
    Cevabı göster

    BlockingCollection — Doğru. BlockingCollection üretici-tüketici için tasarlanmıştır.

  3. BlockingCollection bildirimini tamamla

    var queue = new ____();
    Cevabı göster
    var queue = new BlockingCollection<string>();

Uzman bölümündeki tüm dersler