C#实现的阻塞队列,功能类似GO里的channel。
public class CBlockQueue<T>
{
private readonly Queue<T> queue = new Queue<T>();
private readonly int maxSize;
bool closing;
/// <summary>
/// CBlockQueue init
/// </summary>
/// <param >maxSize</param>
public CBlockQueue(int maxSize)
{
this.maxSize = maxSize;
}
/// <summary>
/// Enqueue
/// </summary>
/// <param >item</param>
public void Enqueue(T item)
{
lock (queue)
{
while (queue.Count >= maxSize)
{
Monitor.Wait(queue);
}
queue.Enqueue(item);
if (queue.Count == 1)
{
// wake up any blocked dequeue
Monitor.PulseAll(queue);
}
}
}
/// <summary>
/// TryDequeue
/// </summary>
/// <param >value</param>
public bool TryDequeue(out T value)
{
lock (queue)
{
while (queue.Count == 0)
{
if (closing)
{
value = default(T);
return false;
}
Monitor.Wait(queue);
}
value = queue.Dequeue();
if (queue.Count == maxSize - 1)
{
// wake up any blocked enqueue
Monitor.PulseAll(queue);
}
return true;
}
}
/// <summary>
/// Get Queue Count
/// </summary>
/// <param ></param>
public int Count()
{
lock (queue)
{
return queue.Count;
}
}
/// <summary>
/// Close Queue
/// </summary>
/// <param ></param>
public void Close()
{
lock (queue)
{
closing = true;
Monitor.PulseAll(queue);
}
}
}
来源:oschina
链接:https://my.oschina.net/u/4354006/blog/3322921