C#
Özet - Concurrent koleksiyonlar
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
-
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
-
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.
-
BlockingCollection bildirimini tamamla
var queue = new ____();
Cevabı göster
var queue = new BlockingCollection<string>();
Sıradaki ders: Channel.Create