2011-08-22 61 views
5

我想弄清楚什麼樣的數據類型使用...基本上我想要一個線程安全的FIFO隊列,並會自動拋出足夠舊的項目,一旦它到達預先規定的限制。線程安全FIFO列表與自動尺寸限制管理

呃,實際上,也許更多的是一個列表,因爲我不想把整個概念推到隊列中,並將一個項目從隊列中彈出,並且不再提供它。

用例基本上是一個播放列表,其中最多有5個即將播放的項目,當前正在播放的項目以及已播放的約20個項目。因此,爲什麼我猜想它不能成爲一個隊列,我將訪問中間的一個項目作爲「當前」項目。當列表變得很大時,我寧願不需要手動管理丟棄舊項目......顯然,我可以自己寫這個,但如果C#已經存在,我不想重新發明輪子。

任何想法,我可以使用什麼?

+0

我做了一個類似的問題(http://stackoverflow.com/questions/17031718/how-to-limit-blockingcollection-size-but-keep-adding-new-itens-net-limited-siz),我想同樣的事情,有限大小的線程安全FIFO。你有沒有找到一個好的解決方案? – Pedro77

回答

3

在這個框架中,有幾乎所有你想要的功能 - ConcurrentQueue。它是線程安全隊列,大多數操作都是無鎖的,因此速度非常快。

的唯一功能是沒有的是「極限」自動「被扔掉」 ......

但可以很容易地添加 - 剛剛創建自己的包含了一個私有ConcurrentQueue類,並實現「拋出部分「通過在排隊新元素之前離隊/拋出,直到滿足您的限制。

編輯 - 按評論
一種選擇是讓第二個「排隊」的ObservableCollection - 雖然不是天生的線程安全(小心),這將在WPF中很容易綁定...

另一種方法是讓你的班級實現ObservableCollection接口(其中包含IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged) - 這聽起來很棒,但其中大部分可以通過中繼到內部ConcurrentQueue輕鬆實現,因此沒有太多真實的代碼可供編寫。
請參閱http://msdn.microsoft.com/en-us/library/ms752347.aspx

+0

也許對於訪問中間部分,我可以創建一個包含兩個隊列的對象......一個包含即將到來的項目,另一個是已播放的項目列表。如果我可以使用WPF綁定工作,那真是太好了...... –

+0

請參閱我的EDIT關於DataBinding ... – Yahia

1

您可以嘗試從Rx獲得new ReplaySubject<T>(int count),該緩存來自觀察事件流的最後一個count對象。

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

如果你需要一個更傳統的編程模型(RX是有點過分了),那麼也許嘗試TPL數據流BroadcastBlock<T>。廣播被命名爲電視廣播 - 如果一幀沒有被「處理」的速度不夠快,它將被丟棄,因此處理與「現場」幀保持相關。

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

UPDATE:ReplaySubject重播第一X,它不是一個FIFO隊列是 '第一X列表'。