Если вы намереваетесь создать парный вариант шаблона производитель-потребитель, то последовательность будет Pulse
до Wait
для производителя и Wait
до Pulse
для потребителя.Вы можете сослаться на цифру 5 в статье Джо Даффи об этом .Howerver, имейте в виду, что, поскольку его реализация выполняет безусловный Wait
в методе Enqueue
, между производителем и потребителем возникнет эффект пинг-понга.В его реализации очередь может иметь только один элемент на одного производителя.Так что, если это ваше намерение, то это ваш билет.В противном случае вы можете адаптировать его как есть и применить некоторое условие 1 к Wait
в методе Enqueue
, чтобы заставить его вести себя как настоящий буфер FIFO.
Однако,как и Рид, я спрашиваю, почему BlockingCollection
нельзя было использовать.Эта коллекция должна быть очень эффективной, так как она использует стратегию без блокировки для методов Add
и Take
.Конечно, как я упоминал выше, если вы действительно хотите парный вариант, то эта коллекция не будет соответствовать вашим требованиям, и вам придется свернуть свой собственный, используя в качестве отправной точки Джо Даффи.
1 Просто не забудьте использовать цикл while
вместо проверки if
перед применением ожидания.Monitor.Wait
просто ожидает изменения состояния блокировки и ничего более, поэтому вам придется перепроверить условие ожидания.