0Pricing
C# Academy · Lesson

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

  1. Parallel.ForEach, PLINQ
  2. Producer/consumer with Channels (overview)
  3. Throughput vs latency trade-offs
← Back to C# Academy