如果我想从外部队列中接收消息,请在Redis
或类似内容中。是否最好让一个线程不断检查队列并将消息发送到相关的BroadcastBlock
进行处理(例如)
if (message.type == "person")
personBroadcast.post(message);
else
monsterBroadcast.post(message);
然后将广播到管道进行处理,或者说4 Tasks
更好地将消息从队列中取出并自行处理?
在第一个实例中,TPL DataFlow
块实际上是并行处理,还是它们需要分别处于单独的任务中?我正在尝试决定哪种方法可以充分利用资源。建议表示赞赏。
答案 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
不需要任何其他任务,因为它会自行创建所需的任务。