BlockingCollection
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
-
Add çağrısını tamamla
collection.____;Cevabı göster
collection.Add("iş"); -
BlockingCollection metotlarını eşleştir
- Add
- Doluysa bekleyip ekle
- Take
- Boşken bekleyip çıkar
- CompleteAdding
- Eklemeyi bitir
-
BlockingCollection varsayılan olarak hangi koleksiyonu sarar?
- ConcurrentStack
- ConcurrentQueue
- ConcurrentBag
- ConcurrentDictionary
Cevabı göster
ConcurrentQueue — Doğru. Varsayılan sarmalanan koleksiyon ConcurrentQueue'dir.