예제 #1
0
        private Updater GetUpdaterList(QueueOrder queue)
        {
            switch (queue)
            {
            default:
            case QueueOrder.PreFixedUpdate: return(firstFixedUpdate);

            case QueueOrder.FixedUpdate: return(fixedUpdate);

            case QueueOrder.PostFixedUpdate: return(lastFixedUpdate);

            case QueueOrder.AfterFixedUpdate: return(afterPhysicsExecuted);

            case QueueOrder.PreUpdate: return(firstUpdate);

            case QueueOrder.Update: return(update);

            case QueueOrder.PostUpdate: return(lastUpdate);

            case QueueOrder.PreLateUpdate: return(firstLateUpdate);

            case QueueOrder.LateUpdate: return(lateUpdate);

            case QueueOrder.PostLateUpdate: return(lastLateUpdate);
            }
        }
예제 #2
0
        /// <summary>
        /// Получить элемент из очереди
        /// </summary>
        /// <param name="item">Полученный из очереди элемент</param>
        /// <returns>Признак успешного получения элемента</returns>
        public bool TryDequeue(out T item)
        {
            lock (innerLock)
            {
                var queueOrder = new QueueOrder(currentOrder, currentSubOrder);

                if (queueDictionary.TryGetValue(queueOrder, out item))
                {
                    queueDictionary.Remove(queueOrder);

                    if (subOrderLimits.ContainsKey(currentOrder) && currentSubOrder == subOrderLimits[currentOrder])
                    {
                        Interlocked.Increment(ref currentOrder);
                        currentSubOrder = 0;
                    }
                    else
                    {
                        Interlocked.Increment(ref currentSubOrder);
                    }

                    Debug.WriteLine(string.Format("OrderedQueue: an item with order {0} was dequeued. Current queue size {1}.", queueOrder, Size));

                    return(true);
                }
            }

            item = default(T);
            return(false);
        }
예제 #3
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.");
            }
        }
예제 #4
0
        int IComparable.CompareTo(object obj)
        {
            if (obj == null)
            {
                return(1);
            }
            TSCQueue q = obj as TSCQueue;

            if (q == null)
            {
                return(1);
            }
            return(QueueOrder.CompareTo(q.QueueOrder));
        }
예제 #5
0
        /// <summary>
        /// Занести элемент в очередь
        /// </summary>
        /// <param name="order">Основной порядковый номер элемента</param>
        /// <param name="subOrder">Второстепенный порядковый номер</param>
        /// <param name="item">Добавляемый элемент</param>
        /// <param name="lastSubOrder">
        /// Указанный второстепенный порядковый номер является последним
        /// для основного порядкового номера
        /// </param>
        public void Enqueue(int order, int subOrder, T item, bool lastSubOrder = false)
        {
            lock (innerLock)
            {
                var queueOrder = new QueueOrder(order, subOrder);

                if (queueDictionary.ContainsKey(queueOrder))
                {
                    throw new Exception("Item with the same order already exists in queue.");
                }

                if (order < currentOrder)
                {
                    throw new Exception("Item with the same order already have been in queue and was dequeued.");
                }

                if (order == currentOrder && subOrder < currentSubOrder)
                {
                    throw new Exception("Item with the same order already have been in queue and was dequeued.");
                }

                if (lastSubOrder && subOrderLimits.ContainsKey(order))
                {
                    throw new Exception("Last sub order was already set.");
                }

                if (lastSubOrder)
                {
                    subOrderLimits[order] = subOrder;
                }

                queueDictionary.Add(queueOrder, item);

                Debug.WriteLine(string.Format("OrderedQueue: an item with order {0} was enqueued. Current queue size {1}.", queueOrder, Size));
            }
        }
예제 #6
0
 internal void QueueCallback(QueueOrder queue, Action method, float secondsToWait, bool scaledTime = true)
 {
     GetUpdaterList(queue).QueueCallback(scaledTime ? (ITimer)UnityTimerScaled : UnityTimerUnscaled, method, secondsToWait);
 }
예제 #7
0
 public void QueueCallback(QueueOrder queue, Action method)
 {
     GetUpdaterList(queue).QueueCallback(method);
     Debug.Log("Queued Update method");
 }
예제 #8
0
 public FrameUpdateReference AddUpdateCallback(Action method, QueueOrder queue, byte order = 127)
 {
     return(new FrameUpdateReference(queue, GetUpdaterList(queue).AddUpdateCallback(method, order)));
 }
예제 #9
0
 /// <param name="scaledTime">Be affected by Time.timeScale</param>
 public static void QueueCallback(QueueOrder queue, Action method, float secondsToWait, bool scaledTime = true)
 {
     Instance.QueueCallback(queue, method, secondsToWait, scaledTime);
 }
예제 #10
0
 public static void QueueCallback(QueueOrder queue, Action method)
 {
     Instance.QueueCallback(queue, method);
 }
예제 #11
0
 public static FrameUpdateReference AddUpdateCallback(Action method, QueueOrder queue, byte order = 127)
 {
     return(Instance.AddUpdateCallback(method, queue, order));
 }
예제 #12
0
 public FrameUpdateReference(QueueOrder queue, UpdateReference reference)
 {
     this.queue     = queue;
     this.reference = reference;
 }