最近做网络综合性实验做一个即时通讯软件的时候,有这样一个情景:某个客户与另外多个客户端进行聊天,由于新消息到达的不确定性,即不知道来不来和不知道什么时候来。
如果用while true + sleep的话有点太浪费资源了,因为现在就是用一个队列里获取消息对象的,于是想做一个阻塞队列。
码农还是直接贴代码吧:
using System;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace IMClient
{
public class BlockingQueue<T> : ConcurrentQueue<T>
{
private Semaphore semaphore;
public BlockingQueue()
{
semaphore = new Semaphore(0, Int32.MaxValue);//消息不知道有多少,设个足够大的吧,初始=0
}
public T Dequeue()
{
T t = default(T);//创建一个类型T的对象
semaphore.WaitOne();//请求信号量,信号量=0,就会阻塞了
base.TryDequeue(out t);//然后出队,继承于同步队列,因此不用加锁了
return t;
}
public new T TryDequeue(out T t)
{
throw new Exception("Unsupport Method Exception");//对不起,我想你用上面的Dequeue方法
}
public new void Enqueue(T t)
{
base.Enqueue(t);//出队
semaphore.Release();//释放信号量
}
}
}