C# BlockingCollection,能够在运行时重新设置最大项数

C# BlockingCollection,能够在运行时重新设置最大项数,c#,.net,multithreading,blockingcollection,C#,.net,Multithreading,Blockingcollection,我有一个BlockingCollection,我在一个典型的发布-订阅类型示例中使用它,其中集合用作缓冲区。当它达到N时,它必须等待读卡器至少消费一项。这个很好用 现在,我希望能够在运行时重置集合可以容纳的最大项数。我知道如何使用锁和监视器来实现这一点,并一起废弃blockingcollection,但我不想重新实现核心框架中已经存在的东西 有什么方法可以实现这一点吗?您只是使用Int-ctor创建BlockingCollection,以使其保持N。为什么不在运行时创建另一个BlockingCo

我有一个
BlockingCollection
,我在一个典型的发布-订阅类型示例中使用它,其中集合用作缓冲区。当它达到N时,它必须等待读卡器至少消费一项。这个很好用

现在,我希望能够在运行时重置集合可以容纳的最大项数。我知道如何使用锁和监视器来实现这一点,并一起废弃blockingcollection,但我不想重新实现核心框架中已经存在的东西


有什么方法可以实现这一点吗?

您只是使用Int-ctor创建BlockingCollection,以使其保持N。为什么不在运行时创建另一个BlockingCollection呢?因为此时BlockingCollection将(可能)充满元素。如果我想增加/减少大小,我就必须清空它(或者等待所有元素被使用),然后重新实例化它。扔掉它是唯一的现实选择。顺便说一句,一个线程可能被埋入Take()调用中,并且永远不会返回。您调用死锁的几率应该相当高。不,您不必重新实例化它,也不必等待它清除。您可以创建一个大小合适的新文件并开始添加。你甚至可以让新产品的消费者端在之前的产品被清除之前不消费。你可以使用两个BlockingCollection(你已经使用的供消费者等待的队列)和一个供制作人等待的池队列吗?如果最初使用N个对象填充池,则会将队列中的对象数量限制为N个,而不会设置一个较低的最大大小。要“增加缓冲区大小”,只需向池中添加更多对象。要“减少缓冲区大小”,请从池中获取对象并允许它们被释放。