0

如果我想从外部队列中获取消息,请说 inRedis或类似的。让一个线程不断检查队列并将消息发送到相关BroadcastBlock的处理(例如)是否更好

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

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

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

4

2 回答 2

1

通过块之间的过滤链接可以更容易地完成:

// 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,因为它会自己创建需要的任务。

于 2017-03-24T19:20:38.167 回答
0

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

于 2013-09-23T16:05:42.503 回答