Я хотел бы знать, можно ли создать несколько экземпляров 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
с тем же IProducerConsumerCollection
. Вот некоторая информация, которую мы имеем из статьи MSDN (что может быть принято означать, что вы можете использовать более одного BlockingCollection
):
Не изменяйте базовую коллекцию напрямую. Используйте методы BlockingCollection для добавления или удаления элементов. Объект BlockingCollection может быть поврежден, если вы напрямую меняете базовую коллекцию.
У нас также есть сама реализация здесь, где мы видим, что 2 SemaphoreSlim
используется для привязки BlockingCollection
. Мы видим, что BlockingCollection
не был создан для поддержки этого и должен будет совместно использовать свои внутренние объекты синхронизации между экземпляром 2, чтобы иметь возможность работать правильно.
Вам не нужно беспокоиться о вызове Dispose
дважды, но вы можете просто использовать блокировку вокруг Dispose
которая должна произойти только один раз, и поэтому она незначительна.