
using System;
using System.Threading;
using System.Collections.Generic;
namespace TestThreadDemos
{
/// <summary>
/// 生产者消费者队列
/// </summary>
public class ProducerConsumerQueue : IDisposable
{
private Thread worker;
private EventWaitHandle wh;
private Queue<string> workQueue;
private object locker;
public ProducerConsumerQueue()
{
wh = new AutoResetEvent(false);
workQueue = new Queue<string>();
locker = new object();
worker = new Thread(Work);
worker.Start();
}
private void Work()
{
while (true)
{
string outTask = null;
lock (locker)
if (workQueue.Count > 0)
outTask = workQueue.Dequeue();
if (outTask == null) return;
if (outTask != null)
{
Console.WriteLine("输出的任务" + outTask);
Thread.Sleep(5000);
}
else
wh.WaitOne();
}
}
public void Dispose()
{
EnWorkQueue(null);
worker.Join();
wh.Close();
}
public void EnWorkQueue(string task)
{
if (workQueue != null)
{
lock (locker)
workQueue.Enqueue(task);
wh.Set();
}
}
}
}