using System.Collections.Concurrent;
using System.Diagnostics;
using System.Threading.Tasks;
const int upperLimit = 1000;
const int itemsToProduce = 100;
static BlockingCollection<long> collection = new BlockingCollection<long>(upperLimit);
static Stopwatch sw = new Stopwatch();
static int totalAdditions = 0;
static int producersStillRunning = 2;
Task[] producers = new Task[2];
producers[0] = Task.Run(() => RunProducer("A", 0));
producers[1] = Task.Run(() => RunProducer("B", itemsToProduce));
Task cleanup = Task.Factory.ContinueWhenAll(producers, (p) => collection.CompleteAdding());
Task.Run(() => RunConsumer());
static void RunProducer(string ID, int start)
for (int i = start; i < start + itemsToProduce; i++)
long ticks = sw.ElapsedTicks;
Console.WriteLine("{0} adding tick value {1}. item# {2}", ID, ticks, i);
if(!collection.IsAddingCompleted)
Interlocked.Add(ref totalAdditions, additions);
Console.WriteLine("{0} is done adding: {1} items", ID, additions);
static void RunConsumer()
foreach (var item in collection.GetConsumingEnumerable())
Console.WriteLine("Consuming tick value {0} : item# {1} : current count = {2}",
item.ToString("D18"), subtractions++, collection.Count);
Console.WriteLine("Total added: {0} Total consumed: {1} Current count: {2} ",
totalAdditions, subtractions, collection.Count);
Console.WriteLine("Press any key to exit");