/// <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)); }
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"); }