Reed tiene razón al decirle que debe implementar el IProducerConsumerCollection<T>
. Sin embargo, hay una clase que puede ayudarte. No está incorporado, pero aparece en MSDN. Simplemente pase este ConcurrentPriorityQueue
a su BlockingCollection
.
Esto es como lo he usado:
private readonly BlockingCollection<KeyValuePair<int, ICommand>> _commands
= new BlockingCollection<KeyValuePair<int, ICommand>>(
new ConcurrentPriorityQueue<int, ICommand>());
El ICommand
es una interfaz en mi proyecto.
Ahora bien, esto le permite añadir elementos como esto:
_actions.Add(new KeyValuePair<int, ICommand>(1, command1));
_actions.Add(new KeyValuePair<int, ICommand>(2, command2));
_actions.Add(new KeyValuePair<int, ICommand>(1, command3));
Los elementos con un valor entero inferior como prioridad se ejecutarán en primer lugar. En el ejemplo anterior:
command1
command3
command2
Cuando bucle sobre su BlockingCollection
, ya no obtendrá los elementos individuales (ICommand
en mi caso), pero un KeyValuePair
. Esto podría requerir algunos cambios de código, por supuesto. Lo bueno es que tiene su prioridad original:
foreach (var command in _queue)
{
var priority = command.Key;
var actualCommand = command.Value;
}