/// <summary> /// Получить элемент из очереди /// </summary> /// <param name="item">Полученный из очереди элемент</param> /// <returns>Признак успешного получения элемента</returns> public bool TryDequeue(out T item) { lock (innerLock) { var queueOrder = new Queue_Order(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); } return(true); } } item = default(T); return(false); }
/// <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 Queue_Order(order, subOrder); if (queueDictionary.ContainsKey(queueOrder)) { throw new Exception("Элемент с таким же порядком уже существует в очереди."); } if (order < currentOrder) { throw new Exception("Элемент с таким же порядком уже был в очереди и был удален из очереди."); } if (order == currentOrder && subOrder < currentSubOrder) { throw new Exception("Элемент с таким же порядком уже был в очереди и был удален из очереди."); } if (lastSubOrder && subOrderLimits.ContainsKey(order)) { throw new Exception("Второстеменный порядковый номер."); } if (lastSubOrder) { subOrderLimits[order] = subOrder; } queueDictionary.Add(queueOrder, item); } }