using System.Collections.Generic;
class ProducerConsumerQueue : IDisposable
private AutoResetEvent _queueEvent;
private object _queueSyncObject;
Queue<string> _taskQueue;
public ProducerConsumerQueue ()
_worker = new Thread(DoWork);
_taskQueue = new Queue<string>();
_queueEvent = new AutoResetEvent(false);
_queueSyncObject = new object();
if (_taskQueue.Count > 0)
task = _taskQueue.Dequeue();
if (task == null) return;
Console.WriteLine ("Performing task: " + task);
public void EnqueueTask(string work)
_taskQueue.Enqueue(work);
public static void Main()
using (ProducerConsumerQueue q = new ProducerConsumerQueue())
for (int i = 0; i < 10; i++) q.EnqueueTask ("Say " + i);
q.EnqueueTask ("Goodbye!");