Я знаю, что вы сказали, что один производитель, несколько потребителей, но все равно стоит упомянуть: если ваша очередь почти заполнена (скажем, 24 из 25 слотов), то, если два потока Push
одновременно, вы будете в конечном итоге превышение лимита. Если даже есть вероятность, что в какой-то момент в будущем у вас может появиться несколько производителей, вам следует подумать о том, чтобы сделать Push
блокирующим вызовом, и попросить его дождаться «доступного» * 1003 *, который сигнализируется после того, как элемент снят с производства или после того, как предмет помещен в очередь, пока есть свободные места.
Единственная другая потенциальная проблема, которую я вижу, это SignalEvent
. Вы не показываете нам реализацию этого. Если он объявлен как public event SignalEventDelegate SignalEvent
, то все будет в порядке, потому что компилятор автоматически добавляет SynchronizedAttribute
. Однако, если SignalEvent
использует делегата поддержки с синтаксисом add
/ remove
, то вам нужно будет обеспечить собственную блокировку для самого события, в противном случае потребитель сможет немного отсоединиться от события. слишком поздно и все еще получаю пару сигналов потом.
Редактировать: На самом деле это возможно независимо; что еще более важно, если вы использовали делегат в стиле свойств для добавления / удаления без соответствующей блокировки, то при попытке его выполнения делегат может оказаться в недопустимом состоянии. Даже с синхронизированным событием потребители должны быть готовы получать (и отменять) уведомления после того, как они отписались.
Кроме этого, я не вижу проблем - хотя это не значит, что их нет, просто я не заметил никаких.