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

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 23, 20262026-05-23T13:43:03+00:00 2026-05-23T13:43:03+00:00

What would be the correct usage of either, BlockingCollection or ConcurrentQueue so you can

  • 0

What would be the correct usage of either, BlockingCollection or ConcurrentQueue so you can freely dequeue items without burning out half or more of your CPU using a thread ?

I was running some tests using 2 threads and unless I had a Thread.Sleep of at least 50~100ms it would always hit at least 50% of my CPU.

Here is a fictional example:

private void _DequeueItem()
{
    object o = null;
    while(socket.Connected)
    {
        while (!listOfQueueItems.IsEmpty)
        {
            if (listOfQueueItems.TryDequeue(out o))
            {
                // use the data
            }
        }
    }
}

With the above example I would have to set a thread.sleep so the cpu doesnt blow up.

Note: I have also tried it without the while for IsEmpty check, result was the same.

  • 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-23T13:43:03+00:00Added an answer on May 23, 2026 at 1:43 pm

    It is not because of the BlockingCollection or ConcurrentQueue, but the while loop:

    while(socket.Connected)
    {
        while (!listOfQueueItems.IsEmpty)
        { /*code*/ }
    }
    

    Of course it will take the cpu down; because of if the queue is empty, then the while loop is just like:

    while (true) ;
    

    which in turn will eat the cpu resources.

    This is not a good way of using ConcurrentQueue you should use AutoResetEvent with it so whenever item is added you will be notified.
    Example:

    private ConcurrentQueue<Data> _queue = new ConcurrentQueue<Data>();
    private AutoResetEvent _queueNotifier = new AutoResetEvent(false);
    
    //at the producer:
    _queue.Enqueue(new Data());
    _queueNotifier.Set();
    
    //at the consumer:
    while (true)//or some condition
    {
        _queueNotifier.WaitOne();//here we will block until receive signal notification.
        Data data;
        if (_queue.TryDequeue(out data))
        {
            //handle the data
        }
    }
    

    For a good usage of the BlockingCollection you should use the GetConsumingEnumerable() to wait for the items to be added, Like:

    //declare the buffer
    private BlockingCollection<Data> _buffer = new BlockingCollection<Data>(new ConcurrentQueue<Data>());
    
    //at the producer method:
    _messageBuffer.Add(new Data());
    
    //at the consumer
    foreach (Data data in _buffer.GetConsumingEnumerable())//it will block here automatically waiting from new items to be added and it will not take cpu down 
    {
        //handle the data here.
    }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I'm trying to figure out what the correct form of exceptions to throw would
How would be correct to get the font elements in the table with color=#0000cc
Would it be correct to say that whenever casting is used, the resulting object
Which would be the correct format for this XML data, are they equivalent or
What would be the correct way to create a fully URL-encoded file:// URI from
What would be the correct universal SQL construct to get the last row inserted
What would be the correct way to add DISTINCT and/or GROUPBY to ContentResolver -based
suppose i have a sequence, called TEST_SEQ what would be the correct way of
I would like to confirm that the following analysis is correct: I am building
I have a problem and i would like to learn the correct way to

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.