Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 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();
     }
 }