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

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

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам