Рид правильно сказал, что вам нужно реализовать IProducerConsumerCollection<T>
.Тем не менее, есть класс, который может вам помочь.Он не встроен, но установлен на MSDN .Просто передайте это ConcurrentPriorityQueue
вашему BlockingCollection
.
Вот как я его использовал:
private readonly BlockingCollection<KeyValuePair<int, ICommand>> _commands
= new BlockingCollection<KeyValuePair<int, ICommand>>(
new ConcurrentPriorityQueue<int, ICommand>());
ICommand
- это интерфейс в моем проекте.
Теперь это позволяет добавлять такие элементы:
_actions.Add(new KeyValuePair<int, ICommand>(1, command1));
_actions.Add(new KeyValuePair<int, ICommand>(2, command2));
_actions.Add(new KeyValuePair<int, ICommand>(1, command3));
Элементы с более низким целочисленным значением в качестве приоритета будут выполняться первыми.В приведенном выше примере:
command1
command3
command2
При циклическом цикле над BlockingCollection
вы больше не получите одиночные элементы (ICommand
в моем случае), а KeyValuePair
.Это может потребовать некоторых изменений кода, конечно.Приятно, что у вас есть первоначальный приоритет:
foreach (var command in _queue)
{
var priority = command.Key;
var actualCommand = command.Value;
}