具有自动大小限制管理的ThreadSafe FIFO列表

时间:2011-08-22 01:04:02

标签: c# list queue

我正在试图找出要使用的数据类型... 基本上我想要一个线程安全的FIFO队列,并且一旦达到预先规定的限制就会自动抛出足够旧的项目。

嗯,实际上,可能更多的是列表,因为我不想要推入队列并从队列中弹出一个项目的整个概念,此时它已不再可用。

用例基本上是一个播放列表,我最多可以有5个即将到来的项目,当前正在播放的项目,然后是大约20个已播放的项目。因此,为什么我猜它不能是一个队列,我将访问中间的一个项目作为“当前”项目。当列表变得很大时,我宁愿不必手动管理扔掉旧物品......显然我可以自己编写这个,但如果C#已经存在,我不想重新发明轮子。

我可以使用的任何想法?

2 个答案:

答案 0 :(得分:3)

在框架中,几乎拥有您想要的功能 - ConcurrentQueue。它是线程安全的队列,大多数操作都是无锁实现的,所以它非常快。

唯一的功能是没有自动“扔掉”的“限制”......

但是这可以很容易地添加 - 只需创建自己的包含私有ConcurrentQueue的类,并通过在排队等待之前离开/扔掉你的限制来实现你的公共入队方法中的“丢弃部分”新元素。

编辑 - 根据评论
一种选择是使第二个“队列”成为ObservableCollection - 虽然不是本身的线程安全(注意),但这很容易在WPF中绑定...

另一种方法是让你的类相应地实现ObservableCollection接口(由IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged组成) - 这听起来很多,但是大多数这些接口都可以通过转发到内部{{1所以没有太多真正的代码可以写... 见http://msdn.microsoft.com/en-us/library/ms752347.aspx

答案 1 :(得分:2)

您可以从Rx尝试new ReplaySubject<T>(int count),它会从观察事件流中缓冲最后count个对象。

http://msdn.microsoft.com/en-us/library/hh229429.aspx

如果您需要更传统的编程模型(Rx稍微有点),那么可以尝试使用TPL DataFlow BroadcastBlock<T>。广播在电视广播中被命名 - 如果一个帧没有被“处理”得足够快,就会被丢弃,因此处理与“实时”帧保持相关。

http://msdn.microsoft.com/en-us/library/hh160447.aspx

UPDATE:ReplaySubject重放第一个X,它不是FIFO队列,它是'First X List'。