c#数据流或任务,消耗要并行处理的消息

时间:2013-09-18 12:05:08

标签: c# multithreading task-parallel-library tpl-dataflow dataflow

如果我想从外部队列中接收消息,请在Redis或类似内容中。是否最好让一个线程不断检查队列并将消息发送到相关的BroadcastBlock进行处理(例如)

if (message.type == "person")
    personBroadcast.post(message);
else
    monsterBroadcast.post(message);

然后将广播到管道进行处理,或者说4 Tasks更好地将消息从队列中取出并自行处理?

在第一个实例中,TPL DataFlow块实际上是并行处理,还是它们需要分别处于单独的任务中?我正在尝试决定哪种方法可以充分利用资源。建议表示赞赏。

2 个答案:

答案 0 :(得分:0)

你的用例听起来像一个,破坏者框架可以派上用场。简而言之,disruptor使用单个线程来侦听事件,然后将它们分派给处理程序(定义中的广播块)。您可以在https://code.google.com/p/disruptor-net/

找到.net版本的disruptor

答案 1 :(得分:0)

使用filtered linking between blocks

可以更加轻松
// this can be a BroadcastBlock too
var broadCastBlock = new BufferBlock();

// filter only persons
broadCastBlock.LinkTo(personBroadcast, m => m.type == "person");

// send all other messages as monsters
broadCastBlock.LinkTo(monsterBroadcast);

每个块都有一个相应的任务,正在线程池中执行。默认情况下,任务未重新启动,但您可以使用DataflowBlockOptions.MaxMessagesPerTask属性更改此行为。这将影响Completion任务。

因此,TPL Dataflow不需要任何其他任务,因为它会自行创建所需的任务。