CodeBlanks Logo Icon CodeBlanks

BlockingCollection

C# kursu · Uzman · Ders 29/47

BlockingCollection ile üretici-tüketici desenini öğrenirsin.

BlockingCollection

BlockingCollection<T>, içine sardığı bir concurrent koleksiyonun üzerine engelleme (blocking) davranışı ekler. Add doluysa yer açılana kadar bekler; Take boşken dolana kadar bekler.

Bu, klasik üretici-tüketici desenini çok kolay yazar. Varsayılan olarak bir ConcurrentQueue sarar. CompleteAdding ile eklemeyi bitirdiğini bildirirsin; tüketici de o zaman sonlanır.

Sınırlı BlockingCollection

new BlockingCollection<int>(5) ile kapasitesi 5 olan sınırlı bir koleksiyon yaratırsın. Altıncı Add çağrısı yer açılana kadar engeller; bu backpressure (geri basınç) sağlar.

Üretici hızlıysa ve tüketici yavaşsa bu, belleğin şişmesini önler. GetConsumingEnumerable() ise koleksiyon tamamlanana kadar öğeleri engellemeli şekilde sıralar.

Uygulama BlockingCollection ile üret ve tüket

Aşağıdaki collection boş. Add ile üç öğe ekle: "a", "b", "c". Sonra CompleteAdding() çağır. En son foreach (var item in collection.GetConsumingEnumerable()) ile her öğeyi yazdır.

Örnek çözümü göster
collection.Add("a"); collection.Add("b"); collection.Add("c"); collection.CompleteAdding(); Sonra foreach (var item in collection.GetConsumingEnumerable()) Console.WriteLine(item);
Örnek çözüm:
using System;
using System.Collections.Concurrent;

class Program
{
    static void Main()
    {
        var collection = new BlockingCollection<string>();
        collection.Add("a");
        collection.Add("b");
        collection.Add("c");
        collection.CompleteAdding();
        foreach (var item in collection.GetConsumingEnumerable())
        {
            Console.WriteLine(item);
        }
    }
}

Kendini test et

  1. Add çağrısını tamamla

    collection.____;
    Cevabı göster
    collection.Add("iş");
  2. BlockingCollection metotlarını eşleştir

    Add
    Doluysa bekleyip ekle
    Take
    Boşken bekleyip çıkar
    CompleteAdding
    Eklemeyi bitir
  3. BlockingCollection varsayılan olarak hangi koleksiyonu sarar?

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

    ConcurrentQueue — Doğru. Varsayılan sarmalanan koleksiyon ConcurrentQueue'dir.

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