In .NET 4.0, you can use:
New Concurrent.BlockingCollection(New Queue)
This even has an option on the constructor to let you specify a maximum queue depth. If it reaches this depth, a call to
Add
will block until the consumer thread takes something out of the queue.