.Net Framework already has such an implementation (used by Windows Communication Foundation). See BufferManager
var buffMgr = BufferManager.CreateBufferManager(
104857600, // use no more than 100 MB in total
10485760); // allocate 10 MB max to each buffer
var buff = buffMgr.TakeBuffer(65535); // allocate a buffer enough to fit a 65 KB object
// note: this could return a buffer bigger than 65 KB
//when done with the buffer:
buffMgr.ReturnBuffer(buff);