Можете ли вы обернуть несколько BlockingCollections вокруг одного магазина поддержки?

1

Я хотел бы знать, можно ли создать несколько экземпляров BlockingCollections с одним хранилищем, например:

ConcurrentStack<object> theStack = new ConcurrentStack<object>();
BlockingCollection<object> blockingStack1 = new BlockingCollection<object>(theStack);
BlockingCollection<object> blockingStack2 = new BlockingCollection<object>(theStack);

Мотивация для этого запроса заключается в следующем: BlockingCollection требует вызова метода Dispose. Это происходит без использования using блока. Однако, поскольку using блок не всегда уместен (подумайте о том, что производитель и потребитель живут не только по разным методам, но и по разным нитям), пытаясь сделать бухгалтерский учет, необходимый для вызова Dispose, становится намного менее тривиальным и намного более ошибочным, склонный. Однако, вместо того, чтобы распространять BlockingCollection, вы можете вместо этого распространять хранилище резервных копий, тогда локальный BlockingCollection может быть локализован локально внутри using блока.

Мое предположение заключается в том, что вы можете, так как в интерфейсе IProducerConsumerCollection нет ничего, на что полагается BlockingCollection, что, похоже, подразумевает иное.

Теги:
blockingcollection
idisposable

1 ответ

0
Лучший ответ

Вы не можете безопасно использовать несколько BlockingCollection с тем же IProducerConsumerCollection. Вот некоторая информация, которую мы имеем из статьи MSDN (что может быть принято означать, что вы можете использовать более одного BlockingCollection):

Не изменяйте базовую коллекцию напрямую. Используйте методы BlockingCollection для добавления или удаления элементов. Объект BlockingCollection может быть поврежден, если вы напрямую меняете базовую коллекцию.

У нас также есть сама реализация здесь, где мы видим, что 2 SemaphoreSlim используется для привязки BlockingCollection. Мы видим, что BlockingCollection не был создан для поддержки этого и должен будет совместно использовать свои внутренние объекты синхронизации между экземпляром 2, чтобы иметь возможность работать правильно.

Вам не нужно беспокоиться о вызове Dispose дважды, но вы можете просто использовать блокировку вокруг Dispose которая должна произойти только один раз, и поэтому она незначительна.

  • 0
    Благодарю. Я полагаю, что вы можете перейти к резервному хранилищу после удаления BlockingCollection.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню