c# ConcurrentQueue+SemaphoreSlim

知识点: 

 ConcurrentQueue队列是一个高效的线程安全的队列,是.Net Framework 4.0,System.Collections.Concurrent命名空间下的一个数据结构。

Semaphore可以决定并发的数量,WaitOne会等待当前的一条并发完成,才允许另一条并发的开启,Release会释放并发,并可以指定并发数量.

常用方法:

(1) 初始化 System.Threading.Semaphore 类的新实例,并指定初始入口数和最大并发入口数。

public Semaphore(int initialCount, int maximumCount);

(2) 阻止当前线程,直到当前 System.Threading.WaitHandle 收到信号。

public virtual bool WaitOne();

(3)退出信号量并返回前一个计数。

public int Release();

 

两者结合起来做一个队列处理(通用的抽象类),使用的时候继承抽象类,实现Do方法即可。

 public abstract class QueenBase
    {
        private ConcurrentQueue _concurrentQueen;
        private SemaphoreSlim _semaphoreSlim;
        private Thread _worker = null;
        public QueenBase()
        {
            _concurrentQueen = new ConcurrentQueue();
            _semaphoreSlim = new SemaphoreSlim(0);
            _worker = new Thread(QueenExcute);
            _worker.IsBackground = true;
            _worker.Start();

        }
        ///


        /// 出队列
        ///

        ///
        private void QueenExcute(object obj)
        {
            while (true)
            {
                T data;
                var sucess = _concurrentQueen.TryDequeue(out data);
                if(sucess)
                {
                    Do(data);
                }
                else
                {
                    _semaphoreSlim.Wait();
                }
            }

        }
        ///


        /// 入队列
        ///

        ///
        public void QueenAdd(T t)
        {
            _concurrentQueen.Enqueue(t);
            _semaphoreSlim.Release();
        }
        ///
        /// 数据处理
        ///

        ///
        protected abstract void Do(T data);
     

    }

你可能感兴趣的:(多线程开发)