Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在TPL数据流中分支逻辑?_C#_.net_Task Parallel Library_Tpl Dataflow - Fatal编程技术网

C# 如何在TPL数据流中分支逻辑?

C# 如何在TPL数据流中分支逻辑?,c#,.net,task-parallel-library,tpl-dataflow,C#,.net,Task Parallel Library,Tpl Dataflow,我是TPL dataflow的新手,所以如果这是一个简单的问题,请原谅我 我有一个接受基类的输入缓冲块。如何根据派生类型从那里分支到块?例如: var inputBlock = new BufferBlock<EventBase>(); //if EventBase is Meeting then go to block X //if EventBase is Appointment the go to block Y var inputBlock=new BufferBlock(

我是TPL dataflow的新手,所以如果这是一个简单的问题,请原谅我

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

var inputBlock = new BufferBlock<EventBase>();
//if EventBase is Meeting then go to block X
//if EventBase is Appointment the go to block Y
var inputBlock=new BufferBlock();
//如果EventBase正在开会,则转到方框X
//如果EventBase是约会,则转到块Y

谢谢

您可以向
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);
var inputBlock=new BufferBlock();
var meetingBlock=新操作块(
eventBase=>
{
var会议=作为会议的eventBase;
//...
});
var appointmentBlock=新动作块(
eventBase=>
{
var appointment=eventBase作为约会;
//...
});
LinkTo(meetingBlock,eventBase=>eventBase正在开会);
LinkTo(appointmentBlock,eventBase=>eventBase是约会);

但正如Servy所指出的,您可能应该避免这种情况,并将类型设计为支持多态性。

如果您想要一个更简单的解决方案,并且不介意使用基于TPL数据流的帮助器库,那么有一个提供了LinkSubscripto()方法的帮助器库

dataflow1;
数据流2;
数据流3;
流程1.链接到(流程2);
流程1.链接到(流程3);
请检查图书馆文件的这一部分。在内部,它使用与引入的@I3arnon相同的机制


免责声明:我是。

的作者,您没有。这就是多态性的全部要点。您应该让每个派生类型重写基类型成员,以便区分使用基类型成员的行为。那么您告诉我们没有办法做到这一点吗?我可以在循环中的TPL数据流之外完成它,只要(EventBase正在开会){},我要问的是如何在数据流块中完成它?我需要定制积木吗?我不是说这不可能,我是说这是个坏主意。这表明设计不好。你不应该这样做。相反,您应该通过使用多态性来设计块以支持任何类型的
EventBase
。我理解你们所说的糟糕的设计,不幸的是,Im受上游提供者的支配,它们的xml块设计得有点糟糕,因此为了缓解我的反序列化问题,具有会议和约会节点的xml数组最容易与基类反序列化,并以这种方式将逻辑分支到处理。很可能有更好的设计,但在这一点上,我非常同意,不想回到反序列化代码。
Dataflow<TIn, TOut> flow1;
Dataflow<TOutSubType1> flow2;
Dataflow<TOutSubType2> flow3;

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