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); } }
/// <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); }
/// <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."); } }
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)); }
/// <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)); } }
internal void QueueCallback(QueueOrder queue, Action method, float secondsToWait, bool scaledTime = true) { GetUpdaterList(queue).QueueCallback(scaledTime ? (ITimer)UnityTimerScaled : UnityTimerUnscaled, method, secondsToWait); }
public void QueueCallback(QueueOrder queue, Action method) { GetUpdaterList(queue).QueueCallback(method); Debug.Log("Queued Update method"); }
public FrameUpdateReference AddUpdateCallback(Action method, QueueOrder queue, byte order = 127) { return(new FrameUpdateReference(queue, GetUpdaterList(queue).AddUpdateCallback(method, order))); }
/// <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); }
public static void QueueCallback(QueueOrder queue, Action method) { Instance.QueueCallback(queue, method); }
public static FrameUpdateReference AddUpdateCallback(Action method, QueueOrder queue, byte order = 127) { return(Instance.AddUpdateCallback(method, queue, order)); }
public FrameUpdateReference(QueueOrder queue, UpdateReference reference) { this.queue = queue; this.reference = reference; }