У меня есть класс, который обрабатывает сообщения:Обработка очереди в параллельных
public abstract class ProcessingBase {
public bool IsBusy { get; set; }
public Queue<CustomMessage> PendingMessages { get; private set; }
public abstract MessageProcessingResult Process();
...
В обрабатывающих модулях, которые я создал до сих пор, один использует очередь для обработки сообщений, отправляя их через сокет, а другой отправляет письма. Это отлично работает для отдельных модулей обработки, но предположим, что я хотел связать эти два?
Я думал, что я мог бы сделать что-то вроде:
public class ChainProcessor : ProcessingBase {
public List<ProcessingBase> Processors { get; set; }
public override MessageProcessingResult Process() {
if (IsBusy)
return null;
IsBusy = true;
CustomMessage msg = null;
this.ProcessedMessages = new List<CustomMessage>();
// create clone of queue
var messagesToSend = new Queue<CustomMessage>(this.PendingMessages);
this.PendingMessages.Clear();
while (messagesToSend.Count > 0 && (msg = messagesToSend.Dequeue()) != null) {
foreach (var processor in this.Processors) {
// something with yield return?
}
}
Это фактическое сцепление, которое я шатким на. В идеале я хотел бы обработать их в виде «волны». Например:
Module 1 - Processed message A
Module 2 - Processed message A
Module 1 - Processed message B
Module 2 - Processed message B
Module 3 - Processed message A
Module 1 - Processed message C
Где каждое сообщение передается по цепочке, при этом сообщения постоянно поступают и уходят по мере их перемещения. Какой был бы лучший способ сделать это? Или я ограничена последовательным передачей каждого сообщения по всей цепочке?
Ie (То, что я не хочу): Модуля 1 - Обработанное ообщение Модуля 2 - Обработанное ообщение Модуля 3 - Обработанное ообщение Модуль 1 - Обработанное сообщение B Модуль 2 - Обработанное сообщение B модуль 3 - Обработанное сообщение B модуль 1 - Обработанное сообщение C
EDIT: Я надеялся, что я мог бы сделать что-то, где первый процессор будет уступать возвращение обратно в «цепи процессор», который будет проходить это сообщение на модуль 2, то, возможно, цепочка может начать следующее сообщение на processo r1
На самом деле, я не против, какой поток, важно то, что они не обрабатываются последовательно (вопрос обновлен). – Echilon