我了解使用ConcurrentQueue的BlockingCollection具有100的绑定(bind)容量。

但是我不确定这意味着什么。

我正在尝试实现一个并发缓存,如果队列大小太大(例如,当缓存溢出时松散的消息),该缓存可以出队,可以在一个操作中出队/入队。有没有一种方法可以使用boundedcapacity为此,还是最好手动执行此操作或创建一个新的集合。

基本上我有一个阅读线程和几个写作线程。如果队列中的数据是所有编写者中“最新鲜的”,我就想这样做。

最佳答案

N的有界容量意味着,如果队列中已经包含N个项目,则任何尝试添加另一个项目的线程都将阻塞,直到另一个线程删除该项目为止。

您似乎想要的是一个不同的概念-您希望最近添加的项目成为使用线程从队列中取出的第一个项目。

您可以通过为基础存储使用 ConcurrentStack 而不是ConcurrentQueue来实现。

您将使用 this constructor 并传递ConcurrentStack

例如:

var blockingCollection = new BlockingCollection<int>(new ConcurrentStack<int>());

通过使用ConcurrentStack,可以确保使用线程出队的每个项目在那时都是队列中最新鲜的项目。

还要注意,如果您为阻塞集合指定了上限,则可以使用 BlockingCollection.TryAdd() ,如果集合在调用时已满,它将返回false

09-25 19:58