Я использую блокирующую коллекцию в сценарии производителя/потребителя, где t s являются большими объектами с размером переменной памяти. Некоторые t s могут быть до 700 МБ, а другие могут быть до 10 МБ. Я хочу установить ограничение на общую память всех объектов, которые хранятся в любое время в коллекции. Я не хочу, чтобы это превышало 1 ГБ памяти, потому что тогда я получаю OutOfMemoryException s. BlockingCollection не предоставляет эту функциональность из коробки. Я могу ограничить емкость коллекции на определенное количество предметов, но не на определенном максимальном общем весе. Поэтому мне, возможно, придется реализовать что -то подобное вручную.
Код: Выделить всё
class WeighedBlockingCollection
{
public WeighedBlockingCollection(long maximumTotalWeight);
public void Add(long itemWeight, Func itemFactory);
public void CompleteAdding();
public IEnumerable GetConsumingEnumerable();
}
Метод добавить имеет параметр func itemfactory , потому что я хочу отложить создание объекта, пока в коллекции не будет достаточно пустого места, чтобы принять его. Кроме этого, эта коллекция должна вести себя точно так же, как встроенная блокировка . Он должен быть безопасным для потока и поддерживать нескольких производителей и потребителей. Он должен
не приоритет меньшим объектам по сравнению с большими объектами.
На случай, если Add вызывается с помощью веса больше, чем указанный максимальный вес , или отрицательно, исключение должно быть добавлено. Это было вдохновлено этим недавним вопросом.
Подробнее здесь:
https://stackoverflow.com/questions/796 ... d-capacity