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(); } }