usually pool object provides constructor with
capacity parameter to be able to create needed size at startup
PurgeAvailable() – I never saw purge word in development, maybe classic Clear would be better
2 linked lists under the hood (not good) – they will produce small allocations/deallocations for each add/remove operations that can be annoying for GC. I don’t know the best approach for optimizing that. For example, Pyro framework has ObjectPool class that uses 2 resizable arrays. They not so good when resizing occured but if you fill pool at startup it give better results – because there is no allocations/deallocations.