我了解使用ConcurrentQueue的BlockingCollection具有100的绑定(bind)容量。
但是我不确定这意味着什么。
我正在尝试实现一个并发缓存,如果队列大小太大(例如,当缓存溢出时松散的消息),该缓存可以出队,可以在一个操作中出队/入队。有没有一种方法可以使用boundedcapacity为此,还是最好手动执行此操作或创建一个新的集合。
基本上我有一个阅读线程和几个写作线程。如果队列中的数据是所有编写者中“最新鲜的”,我就想这样做。
最佳答案
N的有界容量意味着,如果队列中已经包含N个项目,则任何尝试添加另一个项目的线程都将阻塞,直到另一个线程删除该项目为止。
您似乎想要的是一个不同的概念-您希望最近添加的项目成为使用线程从队列中取出的第一个项目。
您可以通过为基础存储使用 ConcurrentStack
而不是ConcurrentQueue来实现。
您将使用 this constructor
并传递ConcurrentStack
。
例如:
var blockingCollection = new BlockingCollection<int>(new ConcurrentStack<int>());
通过使用
ConcurrentStack
,可以确保使用线程出队的每个项目在那时都是队列中最新鲜的项目。还要注意,如果您为阻塞集合指定了上限,则可以使用
BlockingCollection.TryAdd()
,如果集合在调用时已满,它将返回false
。