2

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

4

2 回答 2

2

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


编辑

从代码项目中尝试这个

于 2013-06-10T19:55:58.620 回答
2

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

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

于 2013-06-10T19:56:22.317 回答