Example #1
0
        /// <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);
        }
Example #2
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 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);
            }
        }