我正在试图找出要使用的数据类型... 基本上我想要一个线程安全的FIFO队列,并且一旦达到预先规定的限制就会自动抛出足够旧的项目。
嗯,实际上,可能更多的是列表,因为我不想要推入队列并从队列中弹出一个项目的整个概念,此时它已不再可用。
用例基本上是一个播放列表,我最多可以有5个即将到来的项目,当前正在播放的项目,然后是大约20个已播放的项目。因此,为什么我猜它不能是一个队列,我将访问中间的一个项目作为“当前”项目。当列表变得很大时,我宁愿不必手动管理扔掉旧物品......显然我可以自己编写这个,但如果C#已经存在,我不想重新发明轮子。
我可以使用的任何想法?
答案 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'。