У меня есть класс, который я сейчас использую для создания байтовых массивов (для сетевых пакетов), он начинается с некоторого начального буфера и изменяет размер по мере того, как в него записывается больше данных. Я хочу уменьшить количество G C, вызванного этой утилитой, с помощью ArrayPool
, но мне трудно найти хороший способ предотвратить утечки памяти без слишком больших накладных расходов.
Моя главная Идея состояла в том, чтобы сделать мой класс IDisposable
и вернуть массив обратно в пул при вызове Dispose()
.
using ByteBuilder builder = new ByteBuilder();
builder.AddData(); // Add a bunch of data
// write data to network stream
...
// builder is diposed and memory is returned to ArrayPool at the end of the method call
Проблема здесь в том, что если он используется без объявления using, память никогда не вернется. Есть ли какой-нибудь способ, которым я могу гарантировать, как кто-то использует его?
Другая идея, которую я имел, состояла в том, чтобы использовать финализатор для возврата памяти в пул массивов, но кажется, что это имеет значительные накладные расходы из того, что я прочитал. Я выделяю много массивов, и многие из них могут быть небольшими, поэтому наличие финализатора может показаться не оправданным.