Блокирует производителя до тех пор, пока сбор не достигнет половины его емкости с помощью System.Collections.Concurrent.BlockingCollection - PullRequest
0 голосов
/ 27 января 2011

У меня есть сценарий «один производитель / один потребитель», реализованный с новым BlockingCollection из .NET 4.0.

Проблема заключается в том, что поток производителя просыпается, как только в одном свободном пространстве появляются новыеКоллекция.Я хочу, чтобы производитель блокировал, пока потребитель не потребит по крайней мере половину предметов коллекции.Это потому, что скорость производителя высока, а производство дорого для системы.

Как я могу контролировать условие блокировки для производителя?

1 Ответ

3 голосов
/ 27 января 2011

Подход, который нужно рассмотреть, состоит в том, чтобы ставить в очередь меньше «больших» предметов, чем множество «маленьких» одиночных предметов.

Например, вы можете изменить привязку коллекции к 1 и изменить тип элемента на список элементов. Таким образом, ваш производитель может создать список из 100 элементов и поставить его в очередь, затем потребитель возьмет этот список и обработает его, предоставив производителю возможность начать работу со следующими 100 элементами. Ключевым моментом здесь является то, что производитель будет оптимизирован для создания больших пакетов данных в одном пакете, прежде чем он будет заблокирован в ожидании завершения работы потребителя. В коллекции будет намного меньше побеждать, но производство и потребление все равно будут перекрываться.

Когда потребитель берет список из 100 товаров, он фактически получает половину от общего возможного количества неоплаченных товаров, то есть 200 товаров. Так что концептуально это дает вам ваше условие блокировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...