2

У меня есть класс, который идет для получения объектов из веб-службы. Мое потребление этих объектов не зависит от порядка, поэтому я периодически выдаю свои веб-запросы и добавляю результаты к ConcurrentQueue.Могу ли я добавить к параллельной параллельной параллельной параллели?

В то же время, по мере того как запросы выполняются, мы можем обрабатывать ответы.

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

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

+2

Как [проблема производителя/потребителя] (http://stackoverflow.com/questions/21527214/how-to-rewrite-to-taskt-for-performance-gain)? –

+0

Да, очень похоже! – Matthew

ответ

4

Используйте BlockingCollection, чтобы обернуть ConcurrentQueue (поддержка по умолчанию магазин для BlockingCollection является ConcurrentQueue, так что вам даже не нужно быть явно об этом

Это позволяет писать потребителю как:.

foreach(var item in queue.GetConsumingEnumerable()) 
    Process(item); 
+0

В моем случае 'Process (item)' находится в другом классе, который использует результаты этого метода. Что делать, если я буду «сдавать» внутри, если это «foreach»? – Matthew

+1

@Matthew В этом случае это не будет потребителем, что другая вещь будет потребителем. Просто передайте результат 'queue.GetConsumingEnumerable()' для этого напрямую. Нет никакого реального смысла в повторении этого, чтобы получить все предметы. Это сработает, но это было бы бессмысленно. – Servy

2
  1. Вы можете использовать BlockingCollection.

  2. Вы можете использовать a AutoResetEvent; потребитель ждет на нем всякий раз, когда он попадает на пустой, в то время как производитель (ы) устанавливают его после добавления (или партии добавок, если это лучше подходит для шаблона).

  3. Вы можете иметь потоки производителей, которые выполняют фактическую обработку.

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

Смежные вопросы