/// <summary>
        /// 入队列.
        /// </summary>
        /// <param name="buyingData"></param>
        /// <returns></returns>
        public CommonServiceResult <int> Enqueue(BuyingData buyingData)
        {
            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("入队列: {0}", buyingData);
            }

            lock (locker)
            {
                if (this.userCodeSet.Contains(buyingData.BuyerCode))
                {
                    CommonServiceResult <int> errorResult = new CommonServiceResult <int>()
                    {
                        ResultCode    = "BUYER_CODE_HAD_EXISTS",
                        ResultMessage = "用户代码已经存在于队列中",
                    };
                    return(errorResult);
                }

                this.userCodeSet.Add(buyingData.BuyerCode);
                this.userCodeQueue.Enqueue(buyingData);

                var queueCount = this.userCodeQueue.Count();

                // 通知 其他等待的线程
                Monitor.Pulse(locker);

                return(CommonServiceResult <int> .CreateDefaultSuccessResult(queueCount));
            }
        }
        /// <summary>
        /// 获取可购买的数据.
        /// </summary>
        /// <param name="id"></param>
        /// <param name="batch"></param>
        /// <returns></returns>
        public JsonResult GetBuyableDetail(string id, string batch, string userID)
        {
            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("GetBuyableDetail ( {0}, {1}, {2}  ) Start", id, batch, userID);
            }

            BuyingData buyingData = new BuyingData()
            {
                CommodityMasterCode = id,
                Batch     = batch,
                BuyerCode = userID
            };


            // 这里是 入队列后, 立即返回。
            // 后续客户端通过调用 IsInQueue, 来判断请求是否还在队列里面。
            // 当队列中没有请求的时候, 说明请求已经被处理,通过调用 GetServiceResult 获取执行的结果。

            // 这种处理方式
            // 优点是 客户端不卡, 可以做到 先到先得。
            // 缺点是 客户端/服务端代码量,稍微增加一些。
            CommonServiceResult <int> result = buyerQueueManager.Enqueue(buyingData);

            if (logger.IsDebugEnabled)
            {
                logger.DebugFormat("GetBuyableDetail ( {0}, {1}, {2}  ) Result: {3}", id, batch, userID, result);
            }

            return(Json(result));
        }