| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- using System.Collections.Concurrent;
- using System.Threading;
- namespace SKMC.Api.Common.Types
- {
- /// <summary>
- /// 阻塞队列
- /// </summary>
- /// <typeparam name="T"></typeparam>
- public class BlockingQueue<T>
- {
- private readonly ConcurrentQueue<T> queue;
- private readonly ManualResetEvent manualResetEvent;
- public BlockingQueue()
- {
- queue = new ConcurrentQueue<T>();
- 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();
- }
- }
|