using System.Collections.Concurrent;
using System.Threading;
namespace SKMC.Api.Common.Types
{
///
/// 阻塞队列
///
///
public class BlockingQueue
{
private readonly ConcurrentQueue queue;
private readonly ManualResetEvent manualResetEvent;
public BlockingQueue()
{
queue = new ConcurrentQueue();
manualResetEvent = new ManualResetEvent(false);
}
public int Count { get => queue.Count; }
public void Add(T item)
{
queue.Enqueue(item);
manualResetEvent.Set();
}
public T Take()
{
bool isEmpty = false;
T item = default(T);
while (true)
{
if (queue.Count > 0)
{
queue.TryDequeue(out item);
manualResetEvent.Reset();
}
else
{
isEmpty = true;
}
if (item != null) return item;
if (isEmpty) manualResetEvent.WaitOne();
}
}
public void Stop() => manualResetEvent.Set();
}
}