Параллельный ForEach и очереди - PullRequest
5 голосов
/ 01 июля 2011

Возможно ли иметь параллель для каждого цикла обработки элементов в очереди таким образом, чтобы он:

  1. удаляет только обрабатываемые элементы
  2. Пауза, пока новые элементы не будут добавлены в очередь

РЕДАКТИРОВАТЬ: Это относится к функциональности System.Threading.Tasks 'Parallel.ForEach

Ответы [ 4 ]

8 голосов
/ 01 июля 2011

Подписаться на очередь с помощью Reactive Extensions и выполнить каждый элемент в новой задаче. Вам не придется блокировать или ждать новый элемент, так как он будет добавлен в вашу лямбду подписки, и ваше выполнение / обработка будут параллельными.

http://rxwiki.wikidot.com/101samples

1 голос
/ 05 мая 2012

Используйте BlockingCollection примерно так:

    var bc = new BlockingCollection<int>();
Task.Factory.StartNew(() =>
    {
        ParallelOptions options = new ParallelOptions
            {
                MaxDegreeOfParallelism = 30
            };
        Parallel.ForEach(bc.GetConsumingEnumerable(), options, i => { });
    });
0 голосов
/ 01 июля 2011

Похоже, вы говорите о классической ситуации производителя / потребителя.Меня всегда удивляет, что прямой поддержки этой модели, встроенной в .Net, больше нет.Самое близкое, с чем я сталкивался в .Net, когда-то было спрятано в среде параллелизма и координации, которая была частью пакета Microsoft Robotics.Удачи в поиске сейчас.

Но как только вы знаете, что искать, быстрая проверка Google предоставляет несколько других возможных вариантов.

0 голосов
/ 01 июля 2011

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

...