C# 泛型队列,求修改共用
//泛型队列,可应用读者消费多线程安全模式
class MessageQueue<T>
{
private uint _capacity = 0;//0表示无容量限制
private Queue<T> _queue;
private ManualResetEvent _readerResetEvent;
#region Constructor
/// <summary>
/// 创建无容量限制的队列
/// </summary>
public MessageQueue()
{
this._queue = new Queue<T>();
_readerResetEvent = new ManualResetEvent(false);
}
/// <summary>
/// 创建指定容易的队列
/// </summary>
/// <param name="capacity">队列容量</param>
public MessageQueue(uint capacity)
{
this._queue = new Queue<T>();
this._capacity = capacity;
_readerResetEvent = new ManualResetEvent(false);
}
#endregion
/// <summary>
/// 向队列中写入元素
/// </summary>
/// <param name="item">写入的元素</param>
public void Enqueue(T item)
{
//加锁队列,向_queue里推送数据
lock (((ICollection)_queue).SyncRoot)
{
//数据写入队列
if (0 == _capacity)
_queue.Enqueue(item);
else if (0 < _capacity)
if (_queue.Count < _capacity)
_queue.Enqueue(item);
//唤想挂起的消费者队列
_readerResetEvent.Set();
}
}
/// <summary>
/// 从队列中弹出元素
/// </summary>
/// <returns>弹出的元素</returns>
public T Dequeue()
{
T item = default(T);
while (0 == _queue.Count)//计数器为0,队列为空,挂起消费者线程
_readerResetEvent.WaitOne();
//消费者读取数据
lock (((ICollection)_queue).SyncRoot)
{
//如果队列中为非空,则读取数据
if(0 < _queue.Count)
item = _queue.Dequeue();
}
return item;
}
}
现用NUnit单元测试,发现多个生产者,及多个消费者情况下会抛出异常,求大虾推敲修改!