如何在TPL Dataflow中分支逻辑?

时间:2014-09-02 14:46:44

标签: c# .net task-parallel-library tpl-dataflow

我是TPL数据流的新手,请原谅我,如果这是一个简单的问题。

我有一个输入缓冲区块,它接受一个基类。如何根据派生类型从那里分支到块?例如:

var inputBlock = new BufferBlock<EventBase>();
//if EventBase is Meeting then go to block X
//if EventBase is Appointment the go to block Y

谢谢!

2 个答案:

答案 0 :(得分:6)

您可以向LinkTo方法发送谓词以区分这些项目。但是,您需要从每个块内的EventBase向下转发,以使用特定于该类型的逻辑:

var inputBlock = new BufferBlock<EventBase>();
var meetingBlock = new ActionBlock<EventBase>(
    eventBase =>
    {
        var meeting = eventBase as Meeting;
        //...
    });
var appointmentBlock = new ActionBlock<EventBase>(
    eventBase =>
    {
        var appointment = eventBase as Appointment;
        //...
    });

inputBlock.LinkTo(meetingBlock, eventBase => eventBase is Meeting);
inputBlock.LinkTo(appointmentBlock, eventBase => eventBase is Appointment);

但是,正如Servy指出的那样,你应该避免这种情况并设计你的类型来支持多态性。

答案 1 :(得分:1)

如果您想要一个更简单的解决方案,并且不介意使用基于TPL Dataflow构建的帮助程序库,则DataflowEx提供 LinkSubTypeTo()方法。

Dataflow<TIn, TOut> flow1;
Dataflow<TOutSubType1> flow2;
Dataflow<TOutSubType2> flow3;

flow1.LinkSubTypeTo(flow2);
flow1.LinkSubTypeTo(flow3);

请查看图书馆文档的advanced linking部分。在内部,它使用了相同的机制@ I3arnon。

免责声明:我是DataflowEx的作者。