The short answer, is no, you shouldn't need to call it twice.
Now, let's dig a bit deeper. GC uses generation-based approach. That is - the heap is split into chunks, which are used to optimize GC so it actually runs on smaller memory areas. You can learn more about how GC works here.
When GC runs, it reclaims all the objects from the current generation, which to there are no strong* references (* - it's possible to use System.WeakReference
type to have a reference to an object, while allowing GC to reclaim it). Those objects, which survive the garbage collection, are moved into the next generation. If the next generation is full enough, GC will run on it too - moving the survived objects further.
Having said this, you can see how running the GC the second time will most probably have no difference.
However, in scenarios with heavy load, where objects are created very fast, the time period between two subsequent calls can be enough (depends on the thread's state, priority - which on the calls are made) to create enough objects, which can add some weight to the memory. In that situation the subsequent call can have an effect and clean up a good chunk of memory. While this scenario is potentially possible, it's not really very usual to happen. The reason being that if there is such a load, it will probably continue, so calling GC twice will not have a big difference...