如何限制BlockingCollection大小但不断添加新的itens(.NET限制大小的FIFO)?

时间:2013-06-10 19:53:21

标签: c# producer-consumer lru

我想限制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

2 个答案:

答案 0 :(得分:2)

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


编辑

从代码项目中尝试this one

答案 1 :(得分:2)

您的解决方案将正常运行,但它不是线程安全的。 BlockingCollection<T>没有提供直接处理此问题的机制。

您的解决方案可能仍然会阻止(如果另一个线程在Add()之后调用TryTake)或可能删除一个额外的项目(如果您还要移除另一个线程则删除)。