C# 泛型队列,求修改共用

dun_sh 2010-04-23 09:34:50
//泛型队列,可应用读者消费多线程安全模式
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单元测试,发现多个生产者,及多个消费者情况下会抛出异常,求大虾推敲修改!
...全文
391 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
guanmingle 2010-04-23
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/zh-cn/library/system.collections.icollection.syncroot.aspx
guanmingle 2010-04-23
  • 打赏
  • 举报
回复
关注
guoyichao 2010-04-23
  • 打赏
  • 举报
回复
所有范型集合都不支持synchronize所以SyncRoot应该都为null,lock的时候用lock(this)或者lock(this._queue)代替。
dun_sh 2010-04-23
  • 打赏
  • 举报
回复
自已顶!!
dun_sh 2010-04-23
  • 打赏
  • 举报
回复
按照MSDN的解说,这种利用ICollection.SyncRoot属性来锁定是一种正常的对象锁定常用做法,故问题应该不是出在这里!回去继续写测试代码

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧