How to block an operation until a condition is met?

blocking, c#

Solution

Assuming you are using .NET 4, I'd suggest switching `RecievedMessageBuffer` to be a BlockingCollection. When you are putting messages into it, call it's Add method. When you want to retrieve a message, call it's Take or TryTake methods. Take will block the reading thread until a message is available, without burning CPU like your original example.

// Somewhere else
BlockingCollection<SomethingLikeAMessage> RecievedMessageBuffer = new BlockingCollection<SomethingLikeAMessage>();


// Something like this where your example was
while (this.IsListening)
{
    SomethingLikeAMessage message;
    if (RecievedMessageBuffer.TryTake(out message, 5000);
    {
        message.Reconstruct();
        message.HandleMessage(messageHandler);
    }
}

Problem

I am running this code and it is using a fair amount of CPU even though it is doing absolutely nothing most of the time. ``` while (this.IsListening) { while (this.RecievedMessageBuffer.Count > 0) { lock (this.RecievedMessageBuffer) { this.RecievedMessageBuffer[0].Reconstruct(); this.RecievedMessageBuffer[0].HandleMessage(messageHandler); this.RecievedMessageBuffer.RemoveAt(0); } } } ``` What is the best way to block until a condition is met?

Original source

Related problems