C # 4.0 и очередь с ограниченными потребителями потоков выделенных потоков пула - PullRequest
1 голос
/ 17 апреля 2011
* BlockingCollection

C # 4.0 не отвечает простому требованию:
* Concurrent-очередь для элементов задач.
* Потребители - ограничено N потоков за раз - из пула потоков (потоки, которые не выделены для этой очереди и не блокируются, если в очереди нет элементов).особенно полезно для использования ресурсов, мы должны ограничивать только один (N = 1) поток за раз, и очередь может время от времени быть пустой.

SmartThreadPool имеет хорошую реализацию дляс этой целью, используя группу потоков размером 1.

Я искал хорошее решение с новой параллельной библиотекой C # 4.0, используя внутренний пул потоков .Net.Я могу придумать несколько решений для этого, но мне интересно, есть ли что-то элегантное, чего мне не хватает.

Что вы думаете?

С уважением, Шломи

Ответы [ 2 ]

0 голосов
/ 30 августа 2011

если кто-то заинтересован в предлагаемом решении, просмотрите следующую ветку в разделе форумы msdn: вопрос о форумах параллельных вычислений msdn .

Этот вопрос я задал в связи с вышеизложенным, и Стивен Туб далмне удовлетворительный ответ.

Шломи

0 голосов
/ 17 апреля 2011

Задачи в пуле потоков не должны блокироваться.В то время как в .NET 4.0 была проделана работа по его поддержке, Threadpool на самом деле не предназначен для длительных задач и, конечно, не предназначен для операций, которые блокируют (эмпирическое правило, если время запуска потока незначительно для времени, затрачиваемого назадача, тогда вам лучше раскрутить свою нить).

Если вам кажется, что вы пытаетесь это сделать, вам может быть лучше с IObservable.Взгляните на Rx (Reactive) Extensions для некоторых действительно интересных вещей, которые вы можете сделать с помощью IObservable.По умолчанию IObservable обрабатывает только один запрос за раз, но вы можете легко взять каждый объект по мере его отправки и выбросить его в пул потоков (для фактической обработки) и / или использовать TPL.Здесь вам может помочь TaskScheduler с максимальным параллелизмом.

Я не могу придумать ничего из коробки, которое будет делать то, что вы ищете.Возможно, вы захотите соединить ConcurrentQueue с EventWaitHandle и некоторым количеством рабочих потоков, которыми вы можете управлять.

...