Trzon mówi, że musisz zaimplementować IProducerConsumerCollection<T>
. Istnieje jednak klasa, która może ci pomóc. Nie jest wbudowany, ale jest dostępny na MSDN. Po prostu przekaż ten ConcurrentPriorityQueue
do swojego BlockingCollection
.
ten sposób użyłem go:
private readonly BlockingCollection<KeyValuePair<int, ICommand>> _commands
= new BlockingCollection<KeyValuePair<int, ICommand>>(
new ConcurrentPriorityQueue<int, ICommand>());
ICommand
jest interfejsem w moim projekcie.
Teraz ta pozwala na dodawanie elementów tak:
_actions.Add(new KeyValuePair<int, ICommand>(1, command1));
_actions.Add(new KeyValuePair<int, ICommand>(2, command2));
_actions.Add(new KeyValuePair<int, ICommand>(1, command3));
Produkty o niższej wartości całkowitej jako priorytetu realizowane będą w pierwszej kolejności. W powyższym przykładzie:
command1
command3
command2
Gdy zapętlenie nad BlockingCollection
, nie będziesz już się pojedyncze elementy (ICommand
w moim przypadku), ale KeyValuePair
. Oczywiście może to wymagać pewnych zmian w kodzie. Fajną rzeczą jest to, że masz oryginalny priorytet:
foreach (var command in _queue)
{
var priority = command.Key;
var actualCommand = command.Value;
}