Предотвращение утечек памяти с помощью ArrayPool в классе - PullRequest
1 голос
/ 23 апреля 2020

У меня есть класс, который я сейчас использую для создания байтовых массивов (для сетевых пакетов), он начинается с некоторого начального буфера и изменяет размер по мере того, как в него записывается больше данных. Я хочу уменьшить количество 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, память никогда не вернется. Есть ли какой-нибудь способ, которым я могу гарантировать, как кто-то использует его?

Другая идея, которую я имел, состояла в том, чтобы использовать финализатор для возврата памяти в пул массивов, но кажется, что это имеет значительные накладные расходы из того, что я прочитал. Я выделяю много массивов, и многие из них могут быть небольшими, поэтому наличие финализатора может показаться не оправданным.

...