csharp 生产者 - 消费者模板类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csharp 生产者 - 消费者模板类相关的知识,希望对你有一定的参考价值。

namespace DEMon
{
    /// <summary>
    /// Abstract class to faciliate the construction of processors that follow producer-consumer pattern.
    /// Example: typical invokation sequence
    /// ProducerConsumer.Init()
    /// ProducerConsumer.Add(work_item)
    /// ProducerConsumer.CompleteAndWait();
    /// </summary>
    /// <typeparam name="T">type of the work item</typeparam>
    public abstract class ProducerComsumer<T>
    {
        private BlockingCollection<T> queue;
        private ManualResetEvent initFinished;
        private ManualResetEvent doneUpload;
        private long totalItems;
        public bool Done { get; private set; }
        public const int QueueCapacity = 87352;
        protected ProducerComsumer(int maxParallism = 64)
        {
            queue = new BlockingCollection<T>(QueueCapacity);
            doneUpload = new ManualResetEvent(false);
            initFinished = new ManualResetEvent(false);
            Done = false;
            Task.Run(() =>
            {
                initFinished.WaitOne();

                Parallel.ForEach(queue.GetConsumingEnumerable(), new ParallelOptions() { MaxDegreeOfParallelism = maxParallism }, Process);

                doneUpload.Set();

            });
        }

        protected abstract void Process(T item);

        public void Add(T item)
        {

            queue.Add(item);
        }

        protected abstract void Initialize();

        public void Init()
        {
            Initialize();
            initFinished.Set();
        }


        public void CompleteAndWait()
        {
            if (!queue.IsAddingCompleted)
            {
                queue.CompleteAdding();
            }

            doneUpload.WaitOne();
            Done = true;
        }

        public void CompleteAdding()
        {
            queue.CompleteAdding();
        }

        public long QueueSize()
        {
            return queue.Count;
        }

    }
}

以上是关于csharp 生产者 - 消费者模板类的主要内容,如果未能解决你的问题,请参考以下文章

单生产者/单消费者 的 FIFO 无锁队列

rabbitmq消费者生产者实践

避免消费者/生产者类的并发问题[关闭]

生产者与消费者问题解决:解决先打印出消费的情况

通过生产者消费者模式例子讲解Java基类方法waitnotifynotifyAll

java生产者——消费者 线程模型