Предлагаю прочитать статью от некого Евгения про осторожное использование
ArrayPool в многопоточной среде. Автор рассказал о том, как пул устроен и какие есть способы работать с ним для разных сценариев. Бенчмарки, схемы и разбор диагностик прилагаются. Вот какие выводы были сделаны:
1. Пулинг объектов (в том числе массивов) помогает снизить аллокации и нагрузку на GC.
2. Неудачная или неподходящая для конкретного профиля нагрузки реализация пула может испортить производительность.
3. Для небольших массивов, нужных на короткое время, предпочтительно использовать масштабирующийся
ArrayPool<T>.Shared.4. Для больших массивов желательно использовать пул, созданный через
ArrayPool<T>.Create как более вместительный и не разделённый по потокам.