Advertisement
Guest User

ProducerConsumerQueue Demo

a guest
Oct 9th, 2010
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.28 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace ProducerConsumerQueueTest
  5. {
  6.     class Program
  7.     {
  8.         static ProducerConsumerQueue<string> _messageQueue;
  9.         static volatile bool _stopEnqueuing;
  10.  
  11.         static void Main(string[] args)
  12.         {
  13.             int producerThreadCount = GetNumber("Enter number of producer threads");
  14.             int consumerThreadCount = GetNumber("Enter number of consumer threads");
  15.  
  16.             _messageQueue = new ProducerConsumerQueue<string>(consumerThreadCount);
  17.             _messageQueue.Dequeued += _messageQueue_Dequeued;
  18.             _messageQueue.Logged += _messageQueue_Logged;
  19.  
  20.             var producers = new Thread[producerThreadCount];
  21.             for (int i = 0; i < producerThreadCount; ++i)
  22.             {
  23.                 producers[i] = new Thread(EnqueueForever);
  24.             }
  25.  
  26.             Console.Write("Press Enter to start, then Escape to quit.");
  27.             Console.ReadLine();
  28.  
  29.             for (int i = 0; i < producerThreadCount; ++i)
  30.             {
  31.                 producers[i].Start();
  32.             }
  33.  
  34.             while (Console.ReadKey().Key != ConsoleKey.Escape) { }
  35.  
  36.             _stopEnqueuing = true;
  37.             _messageQueue.Dispose();
  38.  
  39.             Console.WriteLine("Disposed of ProducerConsumerQueue. Press Enter to quit.");
  40.             Console.ReadLine();
  41.         }
  42.  
  43.         static int GetNumber(string prompt)
  44.         {
  45.             int result;
  46.             Console.Write(prompt + ": ");
  47.             while (!int.TryParse(Console.ReadLine(), out result))
  48.             {
  49.                 Console.Write("Unable to parse input. Try again: ");
  50.             }
  51.  
  52.             return result;
  53.         }
  54.  
  55.         static void _messageQueue_Dequeued(object sender, EventArgs<string> e)
  56.         {
  57.             Console.WriteLine("Dequeued: {0}", e.Item);
  58.         }
  59.  
  60.         static void _messageQueue_Logged(object sender, EventArgs<string> e)
  61.         {
  62.             Console.WriteLine("Logged: {0}", e.Item);
  63.         }
  64.  
  65.         static void EnqueueForever()
  66.         {
  67.             var random = new Random();
  68.  
  69.             while (!_stopEnqueuing)
  70.             {
  71.                 _messageQueue.Enqueue(random.Next().ToString());
  72.  
  73.                 Thread.Sleep(random.Next(0, 500));
  74.             }
  75.         }
  76.     }
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement