BlockingCollection - Improves Multithreaded Performance

BlockingCollection<T> helps in producer-consumer scenarios for thread-safe data sharing.


Before (Manual Locking with Poor Performance)

Manually managing thread synchronization with locks leads to complex and inefficient code.

List<int> data = new List<int>();
object lockObj = new object();


void Producer()
{
    for (int i = 0; i < 5; i++)
    {
        lock (lockObj)
        {
            data.Add(i);
        }
    }
}


void Consumer()
{
    while (true)
    {
        int item;
        lock (lockObj)
        {
            if (data.Count == 0) continue;
            item = data[0];
            data.RemoveAt(0);
        }
        Console.WriteLine($"Consumed {item}");
    }
}


After (Efficient Producer-Consumer with BlockingCollection)

Using BlockingCollection<T>, thread synchronization is simpler and more efficient.

using System.Collections.Concurrent;


BlockingCollection<int> queue = new BlockingCollection<int>();


void Producer()
{
    for (int i = 0; i < 5; i++)
    {
        queue.Add(i);
    }
    queue.CompleteAdding();
}


void Consumer()
{
    foreach (var item in queue.GetConsumingEnumerable())
    {
        Console.WriteLine($"Consumed {item}");
    }
}