【问题标题】:How to limit BlockingCollection size but keep adding new itens (.NET limited size FIFO)?如何限制 BlockingCollection 大小但不断添加新项目(.NET 有限大小 FIFO)?
【发布时间】:2013-06-10 19:53:21
【问题描述】:

我想限制 BlockingCollection 的大小。如果我想添加另一个项目并且集合已满,则必须删除最旧的项目。是否有特定于此任务的类或我的解决方案可以?

        BlockingCollection<string> collection = new BlockingCollection<string>(10);

        string newString = "";
        //Not an elegant solution?
        if (collection.Count == collection.BoundedCapacity)
        {
            string dummy;
            collection.TryTake(out dummy);
        }
        collection.Add(newString);

EDIT1:这里有类似的问题:ThreadSafe FIFO List with Automatic Size Limit Management

【问题讨论】:

  • 这不再是一个线程安全的集合,将被删除的内容是完全不可预测的。像缓存一样的嘎嘎声,请查看 MemoryCache 类。
  • 您的目标是什么?你能不做任何事情就扔掉被移除的物品吗?
  • @Hans Passant,嘿!你无处不在! :) 我不明白为什么它不再是线程安全的......
  • @MatthewWatson 我需要消费最新的商品,消费/生产速度可能会有所不同。

标签: c# producer-consumer lru


【解决方案1】:

您所描述的是 LRU 缓存。在标准库中没有我知道的实现,但创建起来并不难。查看这个 c++ implementation 以获取一些线索。


编辑

从代码项目中尝试this one

【讨论】:

  • 谢谢,但这个解决方案有点荒唐(2008 年)。作者评论它:这是一个有趣的想法......“ConcurrentDictionary 可能比我的解决方案表现更好(这是在该类可用之前几年编写的)。如果有人有时间改变它并运行性能测试,我很想看看结果。”
【解决方案2】:

您的解决方案将正常运行,但它不是线程安全的。 BlockingCollection&lt;T&gt; 没有提供直接处理这个问题的机制。

您的解决方案可能仍会阻塞(如果另一个线程在您的 TryTake 之后调用 Add())或可能删除额外的项目(如果另一个线程在您同时删除时删除)。

【讨论】:

  • 我认为 BlockingCollection 是线程安全的。来自 MSDN:“BlockingCollection 是一个线程安全的集合类,它提供以下功能:”msdn.microsoft.com/en-us/library/dd997371.aspx 我在这里缺少什么?
  • @Pedro77 BlockingCollection 线程安全的,不是你对集合的使用。您的解决方案很容易导致项目或块的减少,因为您没有锁定,也没有在单个方法调用中直接在 BC 上使用方法。
  • 你能澄清一下吗?我是 BlockingCollection 新手,看不到死锁...每个线程只能添加或删除,不能同时添加?
  • @Pedro77 假设您的容量有限。线程 1 命中如果,看到,进入块,调用 TryTake。现在你是 boundedCapacity-1 - 线程 2 确实检查过,发现没问题,两个线程都尝试调用 .Add(),但是一个线程会阻塞,因为 BlockingCollection 将在第一次命中后立即达到容量。
  • 哦,我明白了,但是只添加了一个线程,所以它永远不会发生。
猜你喜欢
  • 1970-01-01
  • 2018-12-21
  • 2015-10-11
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
相关资源
最近更新 更多