예제 #1
0
        /// <summary>
        /// 处理订单事宜
        /// </summary>
        private static void ProcessOrders()
        {
            //计算当前线程当前批次处理的事务超时总时间
            TimeSpan   tsTimeout = TimeSpan.FromSeconds(Convert.ToDouble(transactionTimeout * batchSize));
            QueueOrder order     = new QueueOrder();

            while (true)
            {
                ///开始事务的时间间隔节点
                TimeSpan datatimeStarting = new TimeSpan(DateTime.Now.Ticks);
                //单次获取订单所得时间
                double elapsedTime = 0;
                //订单处理计数
                int processedItems = 0;
                //当前批次处理订单集合
                ArrayList queueOrders = new ArrayList();

                //首先验证事务
                using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, tsTimeout))
                {
                    //从队列中检索订单
                    for (int i = 0; i < batchSize; i++)
                    {
                        try
                        {
                            //在一定时间 类接收队列的订单
                            if ((elapsedTime + queueTimeout + transactionTimeout) < tsTimeout.TotalSeconds)
                            {
                                queueOrders.Add(order.Receive(queueTimeout));
                            }
                            else
                            {
                                i = batchSize;  // 结束循环
                            }
                            elapsedTime = new TimeSpan(DateTime.Now.Ticks).TotalSeconds - datatimeStarting.TotalSeconds;
                        }
                        catch (TimeoutException)
                        {
                            //没有可以等待的消息也结束循环
                            i = batchSize;
                        }
                    }

                    //处理队列的订单
                    for (int k = 0; k < queueOrders.Count; k++)
                    {
                        //根据业务逻辑处理
                        //处理代码
                        processedItems++;
                        totalOrdersProcessed++;
                    }
                    //处理完毕或者是超时
                    ts.Complete();
                }
                Console.WriteLine("(Thread Id " + Thread.CurrentThread.ManagedThreadId + ") batch finished, " + processedItems + " items, in " + elapsedTime.ToString() + " seconds.");
            }
        }