我有一个处理消息的类:
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
每条消息都通过链传递,消息在传递时不断进出。这样做的最佳方法是什么?或者我是否仅限于通过整个链顺序传递每条消息?
即(我不想要的): 模块 1 - 已处理的消息 A 模块 2 - 已处理的消息 A 模块 3 - 已处理的消息 A 模块 1 - 已处理的消息 B 模块 2 - 已处理的消息 B 模块 3 - 已处理的消息 B 模块 1 - 已处理消息 C
编辑:我希望我可以做一些事情,让第一个处理器返回到“链处理器”,这会将消息传递到模块 2,然后链可能会在处理器 1 上启动下一条消息