Exemple #1
0
        public DedupingQueueAddResult AddItem(T item)
        {
            lock (itemSync)
            {
                string tokenValue = GetToken(item);
                DedupingQueueItemWrapper <T> wrappedItem;
                if (tokenValue != null && itemsWithTokens.TryGetValue(tokenValue, out wrappedItem)) //if token is already in queue then just swap.
                {
                    wrappedItem.Item = item;
                    return(DedupingQueueAddResult.Duplicate);
                }

                //if no more room than item is dropped
                if (maxCapacity != null && queue.Count >= maxCapacity.Value)
                {
                    return(DedupingQueueAddResult.QueueFull);
                }

                DedupingQueueItemWrapper <T> transientItemWrapper = new DedupingQueueItemWrapper <T>(item);
                queue.Enqueue(transientItemWrapper);
                if (tokenValue != null)
                {
                    itemsWithTokens[tokenValue] = transientItemWrapper;
                }
                return(DedupingQueueAddResult.NewItem);
            }
        }
Exemple #2
0
 /// <summary>
 /// Retrieves the next item if there is one.
 /// </summary>
 /// <param name="item">output parameter to receive the dequeued item</param>
 /// <returns>true if an item has been retrieved, false if the queue was empty.</returns>
 public bool Dequeue(out T item)      //using an output parameter rather than the return value for the dequeued item supports T being a value type.
 {
     item = default(T);
     lock (itemSync)
     {
         if (queue.Count > 0)
         {
             DedupingQueueItemWrapper <T> dequeuedItemWrapper = queue.Dequeue();
             item = dequeuedItemWrapper.Item;
             String idToken = GetToken(item);
             if (idToken != null)
             {
                 itemsWithTokens.Remove(idToken);
             }
             return(true);
         }
         else
         {
             return(false);
         }
     }
 }