Список FIFO ThreadSafe с автоматическим управлением ограничением размера - PullRequest
6 голосов
/ 22 августа 2011

Я пытаюсь выяснить, какой тип данных использовать ... По сути, я хочу очередь FIFO, которая является поточно-ориентированной и автоматически выбрасывает достаточно старые элементы, как только она достигает предопределенного предела.

Ну, на самом деле, может быть, это больше список, потому что я не хочу, чтобы сама концепция выдвигалась в очередь и выталкивала элемент из очереди, после чего он больше не доступен.

ИспользованиеДело в основном для плейлиста, где у меня будет до 5 предстоящих элементов, текущий элемент воспроизведения, а затем около 20 элементов, которые уже были воспроизведены.Следовательно, почему я предполагаю, что это не может быть очередь, я хотел бы получить доступ к одному из элементов в середине как «текущий» элемент.И я бы предпочел не управлять вручную, выбрасывая старые элементы, когда список становится большим ... очевидно, я мог бы написать все это сам, но я не хочу изобретать велосипед, если он уже существует для C #.

Есть идеи, что я мог бы использовать?

Ответы [ 2 ]

3 голосов
/ 22 августа 2011

В Framework есть что-то, имеющее почти необходимую вам функциональность - ConcurrentQueue.Это потокобезопасная очередь, в которой большинство операций реализовано без блокировки, поэтому она очень быстрая.

Единственная функция, которой не соответствует, - это «предел» с автоматическим «выбрасыванием» ...

Но это может быть легко добавлено - просто создайте свой собственный класс, содержащий приватный ConcurrentQueue и реализуйте «выбрасываемую часть» в вашем публичном методе enqueue, удаляя / выбрасывая до тех пор, пока ваш предел не будет достигнут, прежде чем ставить в очередьновый элемент.

РЕДАКТИРОВАТЬ - согласно комментарию :Одним из вариантов будет сделать вторую «Очередь» ObservableCollection - хотя она не является поточно-ориентированной (будьте осторожны), это легко связать в WPF ...

Другой вариант - заставить ваш класс реализоватьObservableCollection интерфейс (который состоит из IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged) соответственно - это звучит много, но большинство из них вы легко реализуете, обращаясь к внутреннему ConcurrentQueue, так что не так много реального кода для написания...Смотри http://msdn.microsoft.com/en-us/library/ms752347.aspx

2 голосов
/ 12 января 2013

Вы можете попробовать new ReplaySubject<T>(int count) из Rx, который буферизует последние count объекты из потока наблюдаемых событий.

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

Если вынужна более обычная модель программирования (Rx немного там), тогда, возможно, попробуйте TPL DataFlow BroadcastBlock<T>.Широковещательная передача называется как в телевизионной трансляции - если кадр не «обрабатывается» достаточно быстро, он отбрасывается, поэтому обработка остается актуальной в отношении «живого» кадра.

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

ОБНОВЛЕНИЕ: ReplaySubject воспроизводит первый X, это не очередь FIFO, это «Первый список X».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...