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 118839
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 11, 20262026-05-11T03:33:29+00:00 2026-05-11T03:33:29+00:00

I have a scenario where I have multiple threads adding to a queue and

  • 0

I have a scenario where I have multiple threads adding to a queue and multiple threads reading from the same queue. If the queue reaches a specific size all threads that are filling the queue will be blocked on add until an item is removed from the queue.

The solution below is what I am using right now and my question is: How can this be improved? Is there an object that already enables this behavior in the BCL that I should be using?

internal class BlockingCollection<T> : CollectionBase, IEnumerable {     //todo: might be worth changing this into a proper QUEUE      private AutoResetEvent _FullEvent = new AutoResetEvent(false);      internal T this[int i]     {         get { return (T) List[i]; }     }      private int _MaxSize;     internal int MaxSize     {         get { return _MaxSize; }         set         {             _MaxSize = value;             checkSize();         }     }      internal BlockingCollection(int maxSize)     {         MaxSize = maxSize;     }      internal void Add(T item)     {         Trace.WriteLine(string.Format('BlockingCollection add waiting: {0}', Thread.CurrentThread.ManagedThreadId));          _FullEvent.WaitOne();          List.Add(item);          Trace.WriteLine(string.Format('BlockingCollection item added: {0}', Thread.CurrentThread.ManagedThreadId));          checkSize();     }      internal void Remove(T item)     {         lock (List)         {             List.Remove(item);         }          Trace.WriteLine(string.Format('BlockingCollection item removed: {0}', Thread.CurrentThread.ManagedThreadId));     }      protected override void OnRemoveComplete(int index, object value)     {         checkSize();         base.OnRemoveComplete(index, value);     }      internal new IEnumerator GetEnumerator()     {         return List.GetEnumerator();     }      private void checkSize()     {         if (Count < MaxSize)         {             Trace.WriteLine(string.Format('BlockingCollection FullEvent set: {0}', Thread.CurrentThread.ManagedThreadId));             _FullEvent.Set();         }         else         {             Trace.WriteLine(string.Format('BlockingCollection FullEvent reset: {0}', Thread.CurrentThread.ManagedThreadId));             _FullEvent.Reset();         }     } } 
  • 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. 2026-05-11T03:33:30+00:00Added an answer on May 11, 2026 at 3:33 am

    That looks very unsafe (very little synchronization); how about something like:

    class SizeQueue<T> {     private readonly Queue<T> queue = new Queue<T>();     private readonly int maxSize;     public SizeQueue(int maxSize) { this.maxSize = maxSize; }      public void Enqueue(T item)     {         lock (queue)         {             while (queue.Count >= maxSize)             {                 Monitor.Wait(queue);             }             queue.Enqueue(item);             if (queue.Count == 1)             {                 // wake up any blocked dequeue                 Monitor.PulseAll(queue);             }         }     }     public T Dequeue()     {         lock (queue)         {             while (queue.Count == 0)             {                 Monitor.Wait(queue);             }             T item = queue.Dequeue();             if (queue.Count == maxSize - 1)             {                 // wake up any blocked enqueue                 Monitor.PulseAll(queue);             }             return item;         }     } } 

    (edit)

    In reality, you’d want a way to close the queue so that readers start exiting cleanly – perhaps something like a bool flag – if set, an empty queue just returns (rather than blocking):

    bool closing; public void Close() {     lock(queue)     {         closing = true;         Monitor.PulseAll(queue);     } } public bool TryDequeue(out T value) {     lock (queue)     {         while (queue.Count == 0)         {             if (closing)             {                 value = default(T);                 return false;             }             Monitor.Wait(queue);         }         value = queue.Dequeue();         if (queue.Count == maxSize - 1)         {             // wake up any blocked enqueue             Monitor.PulseAll(queue);         }         return true;     } } 
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Ask A Question

Stats

  • Questions 102k
  • Answers 102k
  • Best Answers 0
  • User 1
  • Popular
  • Answers
  • Editorial Team

    How to approach applying for a job at a company ...

    • 7 Answers
  • Editorial Team

    How to handle personal stress caused by utterly incompetent and ...

    • 5 Answers
  • Editorial Team

    What is a programmer’s life like?

    • 5 Answers
  • Editorial Team
    Editorial Team added an answer IE has an option: Tools / Internet Options / Advanced… May 11, 2026 at 8:18 pm
  • Editorial Team
    Editorial Team added an answer This can be chosen when configuring the feature including the… May 11, 2026 at 8:18 pm
  • Editorial Team
    Editorial Team added an answer TestOne will be faster than TestTwo, because you're not creating… May 11, 2026 at 8:18 pm

Related Questions

I can understand how one can write a program that uses multiple processes or
I have a scenario where I have multiple versions of the same assembly that
I have a scenario where I'm using a newly added ValidationSummary control. The form
I’m on the learning curve up the Silverlight trail. I’m a data-centric developer so

Trending Tags

analytics british company computer developers django employee employer english facebook french google interview javascript language life php programmer programs salary

Top Members

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.