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