/// <summary>
    /// 多线程读取消息队列示例
    /// </summary>
    class MultiThread
    {
        private System.Threading.Thread[] _ThreadPool; //线程池
        MessageQueue<int> _MessageQueue = new MessageQueue<int>(10000); //初始化消息队列,队列最大长度为10000
        /// <summary>
        /// 线程工作函数
        /// </summary>
        private void Do()
        {
            while (true)
            {
                Console.WriteLine(string.Format("Message:{0} ThreadId:{1}",
                    _MessageQueue.Dequeue(), System.Threading.Thread.CurrentThread.ManagedThreadId));
            }
        }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="threadCount">线程数量</param>
        public MultiThread(int threadCount)
        {
            _ThreadPool = new System.Threading.Thread[threadCount];
            for (int i = 0 ; i < _ThreadPool.Length; i++)
            {
                _ThreadPool[i] = 
                    new System.Threading.Thread(new System.Threading.ThreadStart(Do));
                _ThreadPool[i].IsBackground = true;
            }
        }
        /// <summary>
        /// 向消息队列插入20个数值
        /// </summary>
        public void Enqueue()
        {
            for (int msg = 0; msg < 20; msg++)
            {
                _MessageQueue.Enqueue(msg);
            }
        }
        /// <summary>
        /// 开始多线程读取消息队列
        /// </summary>
        public void Start()
        {
            for (int i = 0; i < _ThreadPool.Length; i++)
            {
                _ThreadPool[i].Start();
            }
        }
    }
    /// <summary>
    /// 消息队列,实现线程安全的消息入队和出队
    /// </summary>
    class MessageQueue<T>
    {
        Queue<T> _MessageQueue = new Queue<T>();
        System.Threading.Semaphore _Sema = new System.Threading.Semaphore(0, 1000000);
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="queueSize">消息队列的最大长度</param>
        public MessageQueue(int queueSize)
        {
            _Sema = new System.Threading.Semaphore(0, queueSize);
        }
        /// <summary>
        /// 入队,向队列插入一条消息,并将信号量加一
        /// </summary>
        /// <param name="value"></param>
        public void Enqueue(T value)
        {
            lock (this)
            {
                _MessageQueue.Enqueue(value);
                _Sema.Release(1);
            }
        }
        /// <summary>
        /// 出队,等待信号量
        /// 从队列中取出一个消息
        /// </summary>
        /// <returns></returns>
        public T Dequeue()
        {
            _Sema.WaitOne();
            lock (this)
            {
                return _MessageQueue.Dequeue();
            }
        }
    }
//主函数
class Program
    {
        static void Main(string[] args)
        {
            MultiThread multiThread = new MultiThread(10);
            multiThread.Enqueue();
            multiThread.Start();
        }
    }