2011-08-22 10 views
5

Estoy tratando de averiguar qué tipo de datos usar ... Básicamente, quiero una cola FIFO que sea segura para subprocesos y arroje automáticamente los elementos antiguos una vez que llegue a un límite preespecificado.Lista FIFO de ThreadSafe con gestión de límite de tamaño automática

Bueno, en realidad, tal vez más de una lista, porque no quiero que todo el concepto de meter la cola y sacar un elemento de la cola en ese punto ya no esté disponible.

El caso de uso es básicamente para una lista de reproducción donde tendría hasta 5 artículos próximos, el elemento que se está reproduciendo actualmente, y luego unos 20 elementos que ya se han reproducido. Por lo tanto, por qué creo que no puede ser una cola, estaría accediendo a uno de los elementos en el medio como el elemento "actual". Y prefiero no tener que gestionar manualmente tirar los artículos viejos cuando la lista llega a ser grande ... obviamente podría escribir esto yo solo, pero no quiero reinventar la rueda si esto ya existe para C#.

¿Alguna idea de lo que podría usar?

+0

Hice una pregunta similar (http://stackoverflow.com/questions/17031718/how-to-limit-blockingcollection-size-but-keep-adding-new-itens-net-limited-siz), quiero lo mismo, un FIFO seguro para Thread de tamaño limitado. ¿Has llegado a una buena solución? – Pedro77

Respuesta

3

En el Framework hay algo que casi tiene la funcionalidad que desea: el ConcurrentQueue. Es una cola segura para subprocesos con la mayoría de las operaciones implementadas sin bloqueos, por lo que es muy rápida.

La única función es que no tiene es el "límite" con cambio automático "usar y tirar" ...

pero que pueden ser fácilmente añadidos - acaba de crear su propia clase que contiene un ConcurrentQueue privada y poner en práctica el " throw-away part "en su método público de enqueue Dequeuing/throwing away hasta que su límite esté satisfecho antes de Enqueuing the new element.

EDITAR - según comentario:
Una opción sería hacer el segundo "cola" un ObservableCollection - aunque no intrínsecamente seguro para subprocesos (cuidado) esto se unen fácilmente en WPF ...

Otro sería hacer que su clase implementara la interfaz ObservableCollection (que consiste en IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged) en consecuencia, eso suena mucho, pero la mayoría de estos se implementa fácilmente al retransmitir a ConcurrentQueue interno, por lo que no hay mucho código real para escribir ...
Ver http://msdn.microsoft.com/en-us/library/ms752347.aspx

+0

Tal vez para acceder a la parte del medio puedo crear un objeto con dos colas ... una que contiene los próximos elementos y otra que es la lista de elementos jugados.Sería genial si pudiera hacer que esto funcionara con WPF binding ... –

+0

ver mi EDIT sobre DataBinding ... – Yahia

1

Puede probar new ReplaySubject<T>(int count) desde Rx, que almacena en búfer los últimos objetos count de la secuencia de eventos observados.

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

Si necesita un modelo de programación más convencional (Rx es un poco por ahí), entonces tal vez tratar TPL DataFlow BroadcastBlock<T>. La emisión se denomina como en la transmisión de TV: si un fotograma no se 'procesa' lo suficientemente rápido se descarta, por lo que el procesamiento sigue siendo relevante con respecto al fotograma 'activo'.

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

ACTUALIZACIÓN: ReplaySubject reproduce la primera X, no es un FIFO cola que es un 'Primera Lista X'.

Cuestiones relacionadas