c# - BlockingCollection 最大大小

标签 c# .net-4.0 concurrency

我知道使用 ConcurrentQueue 的 BlockingCollection 的 boundedcapacity 为 100。

但是我不确定那是什么意思。

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

基本上我有一个阅读线程和几个写作线程。如果队列中的数据是所有写入器中“最新鲜”的,我会喜欢它。

最佳答案

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

您似乎想要的是一个不同的概念 - 您希望最近添加的项目是第一个被消费线程出列的项目。

您可以使用 ConcurrentStack 来实现这一点而不是底层存储的 ConcurrentQueue。

您将使用 this constructor并传入一个 ConcurrentStack

例如:

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

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

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

关于c# - BlockingCollection 最大大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15928642/

相关文章:

asp.net - 在线加载页面时出现 "web.config"文件错误

c# - WriteableBitmap.Lock() 性能问题

scala - 如何向 forkjoinpool 添加更多线程

java - 需要选择更新类似 Guava 缓存的功能

c# - 如何在C#中获取Javascript变量值

c# - AutoMapper ProjectTo 与单个实体?

c# - 使用 .NET 4 任务库在 WPF 中显示阻塞消息框

sql-server - SQL Server 意图锁是如何工作的?

c# - 以编程方式逐字节复制 CD

c# - 创建具有子父概念的Webservice