The garbage collector usually collects managed objects which are not used and referenced anymore automatically. Usually there is no need to (or should not) call GC.Collect() method manually.
But for example (in this case) when you are calling:
queue.Dequeue(item)...
In a long loop, there is no pointer or variable pointing to removed object, but because it is still within method scope the garbage collector does not collect it until memory becomes very low. You can call it manually if you are in critical situation like this.