Какова цель BlockingCollection (T)

Я пытаюсь понять цель BlockingCollection в контексте новых Параллельных Стеков на.NET 4.

В документации MSDN говорится:

BlockingCollection используется в качестве обертки для экземпляра IProducerConsumerCollection, позволяя попытки удаления от набора до блока, пока данные не доступны, чтобы быть удаленными. Точно так же BlockingCollection может быть создан для осуществления верхней границы на количестве элементов данных, позволенных в IProducerConsumerCollection; дополнительные попытки к набору могут затем заблокироваться, пока место не является свободным для хранения добавленных объектов.

Однако, когда я смотрю на реализацию некоторого IProducerConsumerCollection, как ConcurrentQueue я вижу, что они обеспечивают блокировку, свободную, ориентированную на многопотоковое исполнение, реализации. Итак, почему необходим механизм блокировки, который обеспечивает BlockingCollection? Все примеры на шоу MSDN с помощью тех наборов через обертку BlockingCollection, каковы проблемы использовать те наборы непосредственно? Какое преимущество производит использование BlockingCollection?

19
задан wonea 7 February 2018 в 11:46
поделиться

2 ответа

Блокировка до тех пор, пока операция не может быть выполнена, удобна, если вам все равно больше нечего делать (или, скорее: нельзя продолжать, пока операция не будет выполнена).

Если у вас нет -блокирующая очередь, из которой вы хотите читать данные, а данных в данный момент нет, вам нужно периодически опрашивать ее или ждать на каком-то семафоре, пока не появятся данные. Если очередь блокируется, это уже делается автоматически.

Точно так же, если вы попытаетесь добавить в неблокирующую очередь, которая заполнена, операция просто завершится ошибкой, и тогда вам нужно будет выяснить, что делать. Очередь с блокировкой будет просто ждать, пока не освободится место.

Если у вас есть что-то умное вместо ожидания (например, проверка данных в другой очереди или создание исключения QueueTooFullException), тогда вам нужна неблокирующая очередь, но часто это это не так.

18
ответ дан 30 November 2019 в 04:11
поделиться

Целью блокировки является сама блокировка. У вас может быть несколько потоков, считанных из коллекции, и если нет доступных данных, поток будет оставаться заблокированным до тех пор, пока не появятся новые данные.

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

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

7
ответ дан 30 November 2019 в 04:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: