C# 并行处理队列

C# 并行处理队列,c#,.net,parallel-processing,queue,chaining,C#,.net,Parallel Processing,Queue,Chaining,我有一个处理消息的类: public abstract class ProcessingBase { public bool IsBusy { get; set; } public Queue<CustomMessage> PendingMessages { get; private set; } public abstract MessageProcessingResult Process(); ... 每一条信息都通过链条传递,信息在传递过程中不

我有一个处理消息的类:

public abstract class ProcessingBase {
    public bool IsBusy { get; set; }
    public Queue<CustomMessage> PendingMessages { get; private set; }
    public abstract MessageProcessingResult Process();
    ...
每一条信息都通过链条传递,信息在传递过程中不断进出。这样做的最佳方式是什么?或者,我是否仅限于在整个链中按顺序传递每条消息

Ie(我不想要的): 模块1-已处理的消息A 模块2-已处理的消息A 模块3-已处理的消息A 模块1-已处理的消息B 模块2-已处理的消息B 模块3-已处理的消息B 模块1-已处理的消息C

编辑:我希望我可以做一些事情,第一个处理器将返回到“链处理器”,该处理器将该消息传递到模块2,然后链可能会在处理器1上启动下一条消息

我想您可以使用

   BlockingCollection<CustomMessage>
BlockingCollection
对于每个模块。然后,您可以创建多个线程来读取每个集合,并执行模块的处理工作。然后将其放入下一个模块的队列中


通过创建多个线程,您可以并行工作。BlockingCollection是线程安全、快速和阻塞的。非常方便。请参见

您正在寻找线程安全,witch可以唤醒休眠线程(参见示例)

每个工作线程都在自己的线程上运行(如果您对主线程有一些工作),在完成其工作并清空其输入队列后,调用
AutoResetEvent.WaitOne()
。如果输入队列由某个项目填充,请调用
AutoResetEvent.Set()
,这将再次启动该过程

您可以通过创建第二个队列来链接这两个工人,该队列包含第一个工人处理的项目。在第一个worker处理完消息后,将项添加到输出队列中,并调用
AutoResetEvent.Set()

仔细阅读并三思,我不知道您的情况,因此您可以根据需要优化流程


祝你好运

我真的不在乎哪个线程,重要的是它们不是按顺序处理的(问题已更新)。
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
   BlockingCollection<CustomMessage>