private bool _QueueGroupActualReadingIndexNextIncrement; //default false /// <summary> /// Metoda, ktera vraci polozky z fronty dle sveho algoritmu /// Prochazi jednotlive QueueGroupItem a z kazde vemze vzdy jeden QueueItem a pristi vyzvednuti GetNextItem bude brat polozku z dalsiho QueueGroupItem /// </summary> /// <returns>Nalezeny Item ve fronte nebo NULL pokud uz je fronta prazdna</returns> private T GetNextItem(out int p_QueueGroupItemsCount) { T result = null; p_QueueGroupItemsCount = 0; _QueueLock.EnterUpgradeableReadLock(); try { while (result == null && _Queue.Count > 0) { //mohl jsem v dane group dojit k tomu, ze je prazdna, tu group vyhodim, result = null a musim jit na dalsi group //najdi index v listu, ktery budes zpracovavat. Po kazdem precteni se musim posunout na dalsi if (_QueueGroupActualReadingIndexNextIncrement) { _QueueGroupActualReadingIndex = (_QueueGroupActualReadingIndex + 1 >= _Queue.Count || _QueueGroupActualReadingIndex < 0) ? 0 : ++_QueueGroupActualReadingIndex; } QueueByGroupId group = _Queue.ElementAt(_QueueGroupActualReadingIndex); //Debug.WriteLine(String.Format("Fronta ma {0} groups. Aktualni group {1} ma {2} zaznamy", _Items.Count, _QueueGroupActualReadingIndex, group.Count)); if (group.TryDequeue(out result)) { if (ConsumerFindModeItem == QueueConsumerFindModeItem.RotateQueue) { //pokud mam rotovat fronty, tak ted jsem neco nasel a proto rotuju na dalsi frontu _QueueGroupActualReadingIndexNextIncrement = true; } p_QueueGroupItemsCount = group.Count; } else { //v dane group uz nic neni, tak ji vyhazuju _QueueLock.EnterWriteLock(); try { _Queue.RemoveAt(_QueueGroupActualReadingIndex); } finally { _QueueLock.ExitWriteLock(); } //Debug.WriteLine(String.Format("Vyhodil jsem group {0}, uz je zpracovana", _QueueGroupActualReadingIndex)); _QueueGroupActualReadingIndexNextIncrement = false; } } } finally { _QueueLock.ExitUpgradeableReadLock(); } return(result); }
public void AddItem(T p_Item) { if (p_Item != null) { _QueueLock.EnterUpgradeableReadLock(); try { QueueByGroupId queueSameGroupId = _Queue.Find(q => q.QueueGroupId == p_Item.QueueGroupId); if (queueSameGroupId != null) { //Debug.WriteLine("Queue.AddItem: " + p_Item.ToString()); queueSameGroupId.Enqueue(p_Item); } else { _QueueLock.EnterWriteLock(); try { //Debug.WriteLine("Queue.AddItem: " + p_Item.ToString()); QueueByGroupId queueByGroupId = new QueueByGroupId(); queueByGroupId.Enqueue(p_Item); _Queue.Add(queueByGroupId); } finally { _QueueLock.ExitWriteLock(); } } } finally { _QueueLock.ExitUpgradeableReadLock(); } CheckThreadWorking(); } }