Общий .Net Производитель / Потребитель

Я обдумываю идею реализации общей пары «производитель / потребитель + очередь обработки» на C # для развлечения. Идея состоит в том, что вы можете просто создать объекты, реализующие соответствующие интерфейсы IProducer и IConsumer (поставляемые реализации по умолчанию), которые будут состоять в основном из делегатов, передать их экземпляру класса QueueProcessor, сообщить ему, сколько потребителей вы хотите, и приступить.

Но я говорю себе: «Я, конечно, это уже делалось раньше».

Так что кто-нибудь знает о хорошей, универсальной реализации шаблона производитель / потребитель на C # (VB.Net тоже подходит)? Основные требования, которые я ищу:

  • Используйте универсальные шаблоны для производимых и потребляемых типов (входные, поставленные в очередь задачи и выходные типы или любые их комбинации)
  • Позволяют указать, сколько потребителей будет работать в очереди
  • Позволяют объединять или объединять несколько очередей в конвейер (я знаю, сложно с несколькими потребителями)
  • Позволить вам реализовать собственных производителей и потребителей
  • Позвольте вам превратить любой IEnumerable в производителя (хорошо, если мне придется реализовать это сам, насколько это возможно)
  • На основе делегата (вы можете использовать лямбда-синтаксис для основной работы потребителя или производителя для обработки одного элемента)

Или, если его нет, какие подводные камни помешали этому и есть ли у вас мысли, как это реализовать?


person Joel Coehoorn    schedule 27.05.2009    source источник
comment
Вы смотрели на msdn.microsoft.com/en-us/library/dd267312. aspx?   -  person porges    schedule 14.09.2011
comment
Да, и IProducerConsumerCollection ‹T›, но ничего из этого еще не существовало, когда я впервые задал вопрос. Напишите сообщение о поддержке в 4.0, и вы легко получите от меня положительный голос.   -  person Joel Coehoorn    schedule 14.09.2011
comment
Ага! Не знаю, как это происходит ... Я всегда заканчиваю сообщениями двухлетней давности: P   -  person porges    schedule 14.09.2011
comment
Привет, Джоэл Кохорн, пожалуйста, взгляните на этот Продюсер- Пример потребителя, который использует BlockingCollection ‹T›. Это может быть полезно для создания ваших классов «производитель-потребитель», если вы собираетесь создать свою собственную структуру «производитель-потребитель».   -  person sɐunıɔןɐqɐp    schedule 08.11.2017


Ответы (3)


Microsoft CCR содержит многое из того, что вам нужно.

Здесь - примеры кода и примечания по использованию.

person ripper234    schedule 02.06.2009
comment
Однако это не идеальная структура, в которой отсутствуют некоторые очевидные вещи, такие как возможность ОСТАНОВИТЬ обработку и WAIT для оставшихся задач. Мы улучшаем фреймворк в нашей команде разработчиков, если вам понадобится дополнительная помощь, дайте мне знать ... - person ripper234; 03.06.2009

Марк Гравелл написал хороший пример блокировки очереди в этом ответе.

person Don Kirkby    schedule 19.08.2010

Вы смотрели MiscUtil?

person Ruben Bartelink    schedule 27.05.2009
comment
Я не вижу там ничего, что делало бы то, о чем я прошу. - person Joel Coehoorn; 27.05.2009
comment
Нельзя сказать, что я не видел там некоторых вещей, которые были бы очень полезны для реализации этого. - person Joel Coehoorn; 27.05.2009
comment
Так что вы будете вносить любые улучшения, которые вы делаете в свой имп, вовремя ...: P - person Ruben Bartelink; 27.05.2009