Producer/consumer with Channels (overview)
Model producer/consumer queues like Channels using BlockingCollection : bounded buffers (backpressure), multiple consumers, and graceful completion.
Concept & goals
Goal: Build a safe producer/consumer pipeline.
- Channel idea: a queue between producers and consumers
- Bounded capacity provides backpressure
- Support multiple consumers
- Use CompleteAdding for clean shutdown
One producer/consumer
Basic flow: producers Add, consumers iterate GetConsumingEnumerable, then CompleteAdding to finish.
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
public static void Main(string[] args)
{
// Unbounded by default; simple demo
BlockingCollection<int> queue = new BlockingCollection<int>();
// Producer
Task producer = Task.Run(() =>
{
for (int i = 1; i <= 5; i++)
{
queue.Add(i); // enqueue
Console.WriteLine("Produced " + i);
Thread.Sleep(50); // simulate work
}
queue.CompleteAdding(); // signal no more items
});
// Consumer
Task consumer = Task.Run(() =>
{
foreach (int x in queue.GetConsumingEnumerable())
{
Console.WriteLine("Consumed " + x);
Thread.Sleep(80); // simulate processing
}
Console.WriteLine("Consumer done");
});
Task.WaitAll(producer, consumer);
}
}
All lessons in this course
- Parallel.ForEach, PLINQ
- Producer/consumer with Channels (overview)
- Throughput vs latency trade-offs