首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PipeLine处理引擎

PipeLine处理引擎
EN

Stack Overflow用户
提问于 2015-07-29 09:26:03
回答 1查看 1.3K关注 0票数 1
代码语言:javascript
复制
P1---->P2----->(output 1)
P1---->P3---->(output 2)
(output 1) + (output 2) ---->P4

P1进程执行,P1输出作为输入输入到P2进程中。P2也将执行。只有当P4 & P2 & P3完成过程时,才能启动。P4进程不会启动,因为输入进程P3尚未处理(P2输入现在可用)。

任何将触发P4执行进程的输入参数触发机制。我需要任何标准的设计模式或样本代码(C#)来解决上述问题。

还需要在.net 3.5框架中执行进程并行的任何标准方法。

EN

回答 1

Stack Overflow用户

发布于 2015-07-31 10:14:55

有一天我一直在考虑这个问题。

首先,创建一个接口:

代码语言:javascript
复制
public interface IXXX{
    void Process(Model model);
}
public class P1:IXXX{...} //same for p2 p3 p4...

模型包含输入参数和输出结果。

p1 p2都实现了这个接口。

每个处理器都会更改结果的某些部分(Model属性)。

使用IOC容器并将p1和p2注册为接口(或者您可以编写一些简单的代码这样做)。

获取接口的所有实例:

代码语言:javascript
复制
var processors=ServerLocator.GetServices<IXXX>

它将返回一个IEnumerable<IXXX>。此列表包含实现接口IXXX (p1、p2、p3.)的类的所有实例。

代码语言:javascript
复制
var model=new Model();//empty model with input param
foreach(var processor in processors)
{
    processor.Prosess(model);
}

如果要控制流程顺序,可以向接口添加一个方法:

代码语言:javascript
复制
int Order();

每个类(p1,p2)返回一个不同的值(1,2)。

然后按这个值订购。当进程完成时,您就停止了。

(例如,有p1 p2 p3 p4,当p3完成时,有一些条件,不要做p4)。

您可以在模型中添加bool属性,比如DoNext。默认情况下,它应该是false,在p3中,将其更改为true。这样你就可以通过左边了

在foreach{}中,您可以为每个prossecor创建一个任务,在不同的线程中运行所有处理器(但我认为这不是一个管道)。

我不擅长英语。我希望这能帮到你。

更新:

代码语言:javascript
复制
public interface IProcessor
{
    void Process(Model model);
    int Order();
}
public class P1 : IProcessor
{
    public void Process(Model model)
    {
    }

    public int Order()
    {
        return 1;
    }
}

public class P2 : IProcessor
{
    public void Process(Model model)
    {
    }

    public int Order()
    {
        return 2;
    }
}

public class P3 : IProcessor
{
    public void Process(Model model)
    {
    }

    public int Order()
    {
        return 2;
    }
}

public class P4 : IProcessor
{
    public void Process(Model model)
    {
    }

    public int Order()
    {
        return 3;
    }
}

第一步,只运行p1,第二步,异步运行p2和p3,第三步运行p4。

代码语言:javascript
复制
var processors = DependencyResolver.Current.GetServices<IProcessor>();
var group = processors.GroupBy(x => x.Order()).OrderBy(x => x.Key);
var model = new Model();
foreach (var item in group)
{
    var tasks = item.Select(x => Task.Factory.StartNew(() => x.Process(model))).ToArray();
    Task.WaitAll(tasks);
}

我想这就是你想要的

DependencyResolver在asp.net mvc中,您可以将它更改为任何其他ioc容器或使用公共服务定位器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31696383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档