我是TPL数据流的新手,请原谅我,如果这是一个简单的问题。
我有一个输入缓冲区块,它接受一个基类。如何根据派生类型从那里分支到块?例如:
var inputBlock = new BufferBlock<EventBase>();
//if EventBase is Meeting then go to block X
//if EventBase is Appointment the go to block Y
谢谢!
答案 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的作者。