brave-xin

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

    }

  

分类:

技术点:

相关文章:

  • 2021-09-17
  • 2021-07-04
  • 2021-11-09
  • 2021-08-29
  • 2021-06-09
  • 2021-12-05
猜你喜欢
  • 2021-11-08
  • 2021-09-10
  • 2022-01-09
  • 2021-11-17
  • 2021-12-09
  • 2021-11-16
相关资源
相似解决方案