Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 597845
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 13, 20262026-05-13T16:19:29+00:00 2026-05-13T16:19:29+00:00

I have a scenario where I need to remove an item for the queue

  • 0

I have a scenario where I need to remove an item for the queue as soon as been processed.
I understand I cannot remove an item from a collection whilst in loop but was wondering if something
could be done with the Enumerator etc…

This is just a basic example throwing an error
“Collection was modified after the enumerator was instantiated.”

Any suggestions? Thanks a lot!!!

Code is as follows:

     class Program
        {
            static void Main()
            {

                Queue<Order> queueList = GetQueueList();

                foreach (Order orderItem in queueList)
                {
                    Save(orderItem);
                    Console.WriteLine("Id :{0} Name {1} ", orderItem.Id, orderItem.Name);
                    queueList.Dequeue();
                }
                Console.Read();

            }

            private static void Save(Order orderItem)
            {
               //we are pretending to save or do something.
            }

            private static Queue<Order>GetQueueList()
            {
                Queue<Order> orderQueue = new Queue<Order>();
                orderQueue.Enqueue(new Order { Id = 1, Name = "Order 1" });
                orderQueue.Enqueue(new Order { Id = 1, Name = "Order 2" });
                orderQueue.Enqueue(new Order { Id = 2, Name = "Order 3" });
                orderQueue.Enqueue(new Order { Id = 3, Name = "Order 4" });
                orderQueue.Enqueue(new Order { Id = 4, Name = "Order 5" });
                return orderQueue;
            }
        }

        public  class Order
        {
            public int Id { get; set; }
            public string Name { get; set; }
        }
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-13T16:19:29+00:00Added an answer on May 13, 2026 at 4:19 pm

    Change your foreach to:

    while (queueList.Count > 0)
    {
        Order orderItem = queueList.Dequeue();
        Save(orderItem);
        Console.WriteLine("Id :{0} Name {1} ", orderItem.Id, orderItem.Name);
    }
    

    Edit:

    To reprocess if save fails do something like:

    while (queueList.Count > 0)
    {
        Order orderItem = queueList.Dequeue();
    
        if (!Save(orderItem))
        {
            queueList.Enqueue(orderItem); // Reprocess the failed save, probably want more logic to prevent infinite loop
        }
        else
        {
            Console.WriteLine("Successfully saved: {0} Name {1} ", orderItem.Id, orderItem.Name);
        }
    }
    

    Edit:

    John K mentions thread safety which is a valid concern if you have multiple threads accessing the same Queue. See http://ccutilities.codeplex.com/SourceControl/changeset/view/40529#678487 for a ThreadSafeQueue class that covers simple thread safety issues.


    Edit: Here’s the thread safety example I keep pointing everyone to 🙂

    Here’s an example of the thread safety issues mentioned. As shown the default Queue can “miss” items while still decreasing the count.

    Updated: To better represent the problem. I never add a null item to the Queue but the standard Queue.Dequeue() returns several null values. This alone would be fine but in doing so a valid item is removed from the internal collection and the Count decreases. It’s a safe assumption, in this specific example, that every null item returned from a Queue.Dequeue() operation represents a valid item that was never processed.

    using System;
    using System.Collections.Generic;
    using System.Threading;
    
    namespace SO_ThreadSafeQueue
    {
        class Program
        {
            static int _QueueExceptions;
            static int _QueueNull;
            static int _QueueProcessed;
    
            static int _ThreadSafeQueueExceptions;
            static int _ThreadSafeQueueNull;
            static int _ThreadSafeQueueProcessed;
    
            static readonly Queue<Guid?> _Queue = new Queue<Guid?>();
            static readonly ThreadSafeQueue<Guid?> _ThreadSafeQueue = new ThreadSafeQueue<Guid?>();
            static readonly Random _Random = new Random();
    
            const int Expected = 10000000;
    
            static void Main()
            {
                Console.Clear();
                Console.SetCursorPosition(0, 0);
                Console.WriteLine("Creating queues...");
    
                for (int i = 0; i < Expected; i++)
                {
                    Guid guid = Guid.NewGuid();
                    _Queue.Enqueue(guid);
                    _ThreadSafeQueue.Enqueue(guid);
                }
    
                Console.SetCursorPosition(0, 0);
                Console.WriteLine("Processing queues...");
    
                for (int i = 0; i < 100; i++)
                {
                    ThreadPool.QueueUserWorkItem(ProcessQueue);
                    ThreadPool.QueueUserWorkItem(ProcessThreadSafeQueue);
                }
    
                int progress = 0;
    
                while (_Queue.Count > 0 || _ThreadSafeQueue.Count > 0)
                {
                    Console.SetCursorPosition(0, 0);
    
                    switch (progress)
                    {
                        case 0:
                            {
                                Console.WriteLine("Processing queues... |");
                                progress = 1;
                                break;
                            }
                        case 1:
                            {
                                Console.WriteLine("Processing queues... /");
                                progress = 2;
                                break;
                            }
                        case 2:
                            {
                                Console.WriteLine("Processing queues... -");
                                progress = 3;
                                break;
                            }
                        case 3:
                            {
                                Console.WriteLine("Processing queues... \\");
                                progress = 0;
                                break;
                            }
                    }
    
                    Thread.Sleep(200);
                }
    
                Console.SetCursorPosition(0, 0);
                Console.WriteLine("Finished processing queues...");
                Console.WriteLine("\r\nQueue Count:           {0} Processed: {1, " + Expected.ToString().Length + "} Exceptions: {2,4} Null: {3}", _Queue.Count, _QueueProcessed, _QueueExceptions, _QueueNull);
                Console.WriteLine("ThreadSafeQueue Count: {0} Processed: {1, " + Expected.ToString().Length + "} Exceptions: {2,4} Null: {3}", _ThreadSafeQueue.Count, _ThreadSafeQueueProcessed, _ThreadSafeQueueExceptions, _ThreadSafeQueueNull);
    
                Console.WriteLine("\r\nPress any key...");
                Console.ReadKey();
            }
    
            static void ProcessQueue(object nothing)
            {
                while (_Queue.Count > 0)
                {
                    Guid? currentItem = null;
    
                    try
                    {
                        currentItem = _Queue.Dequeue();
                    }
                    catch (Exception)
                    {
                        Interlocked.Increment(ref _QueueExceptions);
                    }
    
                    if (currentItem != null)
                    {
                        Interlocked.Increment(ref _QueueProcessed);
                    }
                    else
                    {
                        Interlocked.Increment(ref _QueueNull);
                    }
    
                    Thread.Sleep(_Random.Next(1, 10)); // Simulate different workload times
                }
            }
    
            static void ProcessThreadSafeQueue(object nothing)
            {
                while (_ThreadSafeQueue.Count > 0)
                {
                    Guid? currentItem = null;
    
                    try
                    {
                        currentItem = _ThreadSafeQueue.Dequeue();
                    }
                    catch (Exception)
                    {
                        Interlocked.Increment(ref _ThreadSafeQueueExceptions);
                    }
    
                    if (currentItem != null)
                    {
                        Interlocked.Increment(ref _ThreadSafeQueueProcessed);
                    }
                    else
                    {
                        Interlocked.Increment(ref _ThreadSafeQueueNull);
                    }
    
                    Thread.Sleep(_Random.Next(1, 10)); // Simulate different workload times
                }
            }
    
            /// <summary>
            /// Represents a thread safe <see cref="Queue{T}"/>
            /// </summary>
            /// <typeparam name="T"></typeparam>
            public class ThreadSafeQueue<T> : Queue<T>
            {
                #region Private Fields
                private readonly object _LockObject = new object();
                #endregion
    
                #region Public Properties
                /// <summary>
                /// Gets the number of elements contained in the <see cref="ThreadSafeQueue{T}"/>
                /// </summary>
                public new int Count
                {
                    get
                    {
                        int returnValue;
    
                        lock (_LockObject)
                        {
                            returnValue = base.Count;
                        }
    
                        return returnValue;
                    }
                }
                #endregion
    
                #region Public Methods
                /// <summary>
                /// Removes all objects from the <see cref="ThreadSafeQueue{T}"/>
                /// </summary>
                public new void Clear()
                {
                    lock (_LockObject)
                    {
                        base.Clear();
                    }
                }
    
                /// <summary>
                /// Removes and returns the object at the beggining of the <see cref="ThreadSafeQueue{T}"/>
                /// </summary>
                /// <returns></returns>
                public new T Dequeue()
                {
                    T returnValue;
    
                    lock (_LockObject)
                    {
                        returnValue = base.Dequeue();
                    }
    
                    return returnValue;
                }
    
                /// <summary>
                /// Adds an object to the end of the <see cref="ThreadSafeQueue{T}"/>
                /// </summary>
                /// <param name="item">The object to add to the <see cref="ThreadSafeQueue{T}"/></param>
                public new void Enqueue(T item)
                {
                    lock (_LockObject)
                    {
                        base.Enqueue(item);
                    }
                }
    
                /// <summary>
                /// Set the capacity to the actual number of elements in the <see cref="ThreadSafeQueue{T}"/>, if that number is less than 90 percent of current capactity.
                /// </summary>
                public new void TrimExcess()
                {
                    lock (_LockObject)
                    {
                        base.TrimExcess();
                    }
                }
                #endregion
            }
    
        }
    }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

No related questions found

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.