.NET Framework 4.0-এ System.Collections.Concurrent নামস্পেস চালু করা হয়েছিল, যাতে থ্রেড-সেফ এবং স্কেলেবল কালেকশন ক্লাসগুলো থাকে। এই ক্লাসগুলো মাল্টিপল থ্রেড একসাথে নিরাপদে আইটেম যোগ/মুছে দিতে পারে।
প্রধান কনকারেন্ট কালেকশনগুলো
| ক্লাস | ব্যাখ্যা | উপযোগী পরিস্থিতি |
|---|---|---|
BlockingCollection<T> | বাউন্ডিং এবং ব্লকিং ফাংশনালিটি সহ যেকোনো টাইপের জন্য | প্রডিউসার-কনসিউমার প্যাটার্ন |
ConcurrentDictionary<TKey,TValue> | থ্রেড-সেফ কি-ভ্যালু ডিকশনারি | ক্যাশে, শেয়ার্ড স্টেট ম্যানেজমেন্ট |
ConcurrentQueue<T> | থ্রেড-সেফ FIFO (First-In-First-Out) কিউ | টাস্ক কিউ, মেসেজ পাসিং |
ConcurrentStack<T> | থ্রেড-সেফ LIFO (Last-In-First-Out) স্ট্যাক | অনডো মেকানিজম, ডিপথ-ফার্সট ট্রাভার্সাল |
ConcurrentBag<T> | থ্রেড-সেফ অনঅর্ডার্ড কালেকশন | অর্ডার গুরুত্বহীন কনকারেন্ট কাজ |
IProducerConsumerCollection<T> | ব্লকিং কালেকশনে ব্যবহারের ইন্টারফেস | কাস্টম কনকারেন্ট কালেকশন বানানোর জন্য |
লাইটওয়েট সিঙ্ক্রোনাইজেশন প্রিমিটিভ
.NET 4.0-এ নতুন:
SpinLock- খুব ছোট криティিক্যাল সেকশনের জন্যSpinWait- বেসি-ওয়েইটিং এড়াতে স্পিনিংBarrier- ফেজ-বেসড সিঙ্ক্রোনাইজেশনCountdownEvent- সিগন্যালিং প্রিমিটিভ
ConcurrentDictionary উদাহরণ
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
var dict = new ConcurrentDictionary<string, int>();
// থ্রেড-সেফ যোগ/আপডেট
dict.TryAdd("key1", 1);
dict.AddOrUpdate("key1", 1, (k, v) => v + 1);
// থ্রেড-সেফ পড়া
if (dict.TryGetValue("key1", out int value))
Console.WriteLine(value);
// প্যারালেল অ্যাক্সেস টেস্ট
Parallel.For(0, 1000, i =>
{
dict.AddOrUpdate("counter", 1, (k, v) => v + 1);
});
Console.WriteLine($"ফাইনাল কাউন্ট: {dict["counter"]}"); // 1000 হবে
ConcurrentQueue উদাহরণ (প্রডিউসার-কনসিউমার)
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
var queue = new ConcurrentQueue<int>();
var cts = new CancellationTokenSource();
// প্রডিউসার
Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
queue.Enqueue(i);
Console.WriteLine($"এনকিউ: {i}");
Thread.Sleep(100);
}
cts.Cancel();
}, cts.Token);
// কনসিউমার
Task.Run(() =>
{
while (!cts.Token.IsCancellationRequested || !queue.IsEmpty)
{
if (queue.TryDequeue(out int item))
Console.WriteLine($"ডিকিউ: {item}");
else
Thread.Sleep(50);
}
}, cts.Token);
ConcurrentStack উদাহরণ
using System;
using System.Collections.Concurrent;
var stack = new ConcurrentStack<int>();
stack.Push(1);
stack.Push(2);
stack.Push(3);
if (stack.TryPop(out int result))
Console.WriteLine($"পপ করা: {result}"); // 3
if (stack.TryPeek(out int peeked))
Console.WriteLine($"পিক করা: {peeked}"); // 2
পারফরম্যান্স টিপস
ConcurrentDictionary-এGetOrAdd,AddOrUpdateঅ্যাটমিক অপারেশন ব্যবহার করুন।- বড় কালেকশনে
ToArray()বাToList()এড়ান - এনুমেরেশন লক-ফ্রি কিন্তু স্ন্যাপশট নেয়। BlockingCollectionব্যবহার করুন প্রডিউসার-কনসিউমার সিনারিওতে বাউন্ডেড ক্যাপাসিটির জন্য।