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

dun_sh dun_sh 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
//泛型队列,可应用读者消费多线程安全模式
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单元测试,发现多个生产者,及多个消费者情况下会抛出异常,求大虾推敲修改!
...全文
评论 6
收藏 已收藏
分享
返回顶部
dun_sh
C# 111,128 成员 642,537 内容