Bounded Queue with multiple consumers and multiple producers
The implementation clearly has a race condition:


Let's assume Count == _boundedCapacity - 1
Now have 2 producers call Insert simultaneously
Both simultaneously check that the current size is less than the upper bound and move beyond the while loop
Both insert an item.
Now you've exceeded the bounded capacity by 1


While it might be ok to be able to exceed the upper bound by up to the maximum number of producers - 1 the same race occurs in Take. Except on the consumer side it has the nasty side-effect of potentially trying to remove an object from an empty collection. In this case default(T) gets returned which the caller might not expect since Insert doesn't accept null objects.

Based on the null check in Insert I would infer that you never expect this to be instantiated on a value type but only reference types. I don't see any reason for it but if this should really not be allowed then add the type restriction where T: class to the implementation to make it clear.

In the end the bounded capacity really doesn't mean all that much since it's randomly exceeded and one can dequeue randomly from an empty queue.

Overall you should use BlockingCollection&lt;T&gt; to wrap the ConcurrentQueue&lt;T&gt; which implements the bounding capacity correctly. Just make sure to use the Add and Take methods accepting a CancellationToken so blocked operations can get interrupted nicely when you want to shutdown the application.