/// <summary>
        /// Recurse search for an element to take
        /// </summary>
        /// <param name="currentQueueNumber">Queue number (priority)</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)                     // we skip element if usage of such address if exceeded allowed limit
                    {
                        items.RemoveAt(i);
                        _itemCounters.IncrementCount(item.Key);
                        return(item.Item);
                    }
                }
            }
            return(DequeueItemsReqursively(nextQueueNumber));
        }
Пример #2
0
        private TItem DequeueItemsCycle()
        {
            // already locked:
            if (_itemsInUseCounters.TotalCount >= _maxTotalUsingItemsCount)
            {
                throw new Exception("Cannot get item because max total limit exceeded");
            }

            foreach (var items in _itemCollections)
            {
                for (int j = 0; j < items.Count; ++j)
                {
                    var item = items[j];
                    if (_itemsInUseCounters.GetCount(item.Key) < _maxParallelUsingItemsCount)                     // skip element if usage count limit exceeded
                    {
                        items.RemoveAt(j);
                        _itemsInUseCounters.IncrementCount(item.Key);
                        return(item.Item);
                    }
                }
            }
            throw new Exception("All queues passed, no more queues");
        }