/// <summary>
        /// Рекурсивно выбирает нужный итем
        /// </summary>
        /// <param name="currentQueueNumber">Номер очереди (приоритет)</param>
        /// <returns></returns>
        private TItem DequeueItemsReqursively(int currentQueueNumber)
        {
            int nextQueueNumber = currentQueueNumber + 1;

            if (currentQueueNumber >= _itemCollections.Count)
            {
                throw new Exception("No more queues");
            }

            var items = _itemCollections[currentQueueNumber];

            if (items.Count > 0)
            {
                for (int i = 0; i < items.Count; i++)
                {
                    var item = items[i];
                    if (_itemCounters.GetCount(item.Key) < _maxParallelUsingItemsCount)                     // т.е. пропускаем итем в случае превышения использования итемов с таким ключем
                    {
                        items.RemoveAt(i);
                        _itemCounters.IncrementCount(item.Key);
                        return(item.Item);
                    }
                }
            }
            return(DequeueItemsReqursively(nextQueueNumber));
        }
예제 #2
0
        private TItem DequeueItemsCycle()
        {
            if (_itemsInUseCounters.TotalCount >= _maxTotalUsingItemsCount)
            {
                throw new Exception("Cannot get item because max total limit riched");
            }

            foreach (var items in _itemCollections)
            {
                for (int j = 0; j < items.Count; ++j)
                {
                    var item = items[j];
                    if (_itemsInUseCounters.GetCount(item.Key) < _maxParallelUsingItemsCount)                             // т.е. пропускаем итем в случае превышения использования итемов с таким ключем
                    {
                        items.RemoveAt(j);
                        _itemsInUseCounters.IncrementCount(item.Key);
                        return(item.Item);
                    }
                }
            }
            throw new Exception("No more queues");
        }