C# 如何限制BlockingCollection大小,但继续添加新iTen(.NET limited size FIFO)?

C# 如何限制BlockingCollection大小,但继续添加新iTen(.NET limited size FIFO)?,c#,producer-consumer,lru,C#,Producer Consumer,Lru,我想限制BlockingCollection的大小。如果我想添加另一个项目,但集合已满,则必须删除最旧的项目。是否有特定于此任务的类或我的解决方案是否可行 BlockingCollection<string> collection = new BlockingCollection<string>(10); string newString = ""; //Not an elegant solution? i

我想限制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);
BlockingCollection=newblockingcollection(10);
字符串newString=“”;
//不是一个优雅的解决方案?
if(collection.Count==collection.BoundedCapacity)
{
虚拟字符串;
收集。TryTake(输出虚拟);
}
collection.Add(新闻字符串);

EDIT1:这里有类似的问题:

您描述的是LRU缓存。据我所知,在标准库中没有实现,但创建起来并不困难。看这个C++的一些线索。
编辑


从代码项目中尝试,您描述的是LRU缓存。据我所知,在标准库中没有实现,但创建起来并不困难。看这个C++的一些线索。
编辑


从代码项目中尝试您的解决方案将正常运行,但它不是线程安全的
BlockingCollection
不提供直接处理此问题的机制


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

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



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

这不再是线程安全的集合,将删除的内容完全不可预测。取而代之,看看MemoryCache类,你的目标是什么?“你能把被拿走的东西扔掉而不做任何事情吗?”汉斯·帕桑,嘿!你无处不在!:)我不明白为什么它不再是线程安全的…@MatthewWatson我需要消费最新的物品,消费者/生产速度可能会有所不同。这不再是线程安全的集合,将被删除的内容完全不可预测。取而代之,看看MemoryCache类,你的目标是什么?“你能把被拿走的东西扔掉而不做任何事情吗?”汉斯·帕桑,嘿!你无处不在!:)我不明白为什么它不再是线程安全的…@MatthewWatson我需要消费最新的物品,消费者/生产速度可能会有点不同。我认为BlockingCollection是线程安全的。来自MSDN:“BlockingCollection是一个线程安全的集合类,它提供以下功能:“我在这里缺少了什么?@Pedro77 BlockingCollection是线程安全的,您对集合的使用不是线程安全的。您的解决方案很容易导致更少的项或块,因为您没有在单个方法调用中锁定和直接使用BC上的方法。您能澄清一下吗?我是一个BlockingCollection新手,我看不到僵局。。。每个线程只能添加或删除,不能同时添加或删除?@Pedro77表示您的容量有限。线程1点击if,看到它,进入block,调用TryTake。现在您已经绑定了capacity-1-线程2进行了检查,看到没问题,两个线程都尝试调用.Add(),但其中一个线程将被阻止,因为BlockingCollection在第一次命中时就已满负荷。哦,我明白了,但只有一个线程正在添加,所以它永远不会发生。我认为BlockingCollection是线程安全的。来自MSDN:“BlockingCollection是一个线程安全的集合类,它提供以下功能:“我在这里缺少了什么?@Pedro77 BlockingCollection是线程安全的,您对集合的使用不是线程安全的。您的解决方案很容易导致更少的项或块,因为您没有在单个方法调用中锁定和直接使用BC上的方法。您能澄清一下吗?我是一个BlockingCollection新手,我看不到僵局。。。每个线程只能添加或删除,不能同时添加或删除?@Pedro77表示您的容量有限。线程1点击if,看到它,进入block,调用TryTake。现在您已经绑定了capacity-1-线程2进行了检查,看到没问题,两个线程都尝试调用.Add(),但其中一个线程将被阻止,因为BlockingCollection在第一次命中时就已满负荷。哦,我知道了,但只有一个线程正在添加,所以它永远不会发生。谢谢,但这个解决方案有点像wold(2008)。作者评论道:这是一个有趣的想法。。。“ConcurrentDictionary可能比我的解决方案(它是在该类可用之前几年编写的)性能更好。如果有人有时间修改它并运行性能测试,我希望看到结果。”谢谢,但这个解决方案有点像wold(2008)。作者评论道:这是一个有趣的想法。。。“ConcurrentDictionary的性能可能比我的解决方案(该解决方案是在该类可用之前几年编写的)要好。如果有人有时间修改此解决方案并运行性能测试,我希望看到结果。”