管道处理引擎

本文关键字:引擎 处理 管道 | 更新日期: 2023-09-27 18:05:13

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框架中的进程并行。

管道处理引擎

几天前我一直在想这件事。
首先,创建一个接口:

public interface IXXX{
    void Process(Model model);
}
public class P1:IXXX{...} //same for p2 p3 p4...

模型包含输入参数和输出结果。
P1 p2都实现了这个接口。
每个处理器都会更改结果的某些部分(Model属性)。
使用IOC容器并将p1和p2注册为容器的接口(或者您可以编写一些简单的代码来完成此操作)。
获取接口的所有实例:

var processors=ServerLocator.GetServices<IXXX>

返回一个IEnumerable<IXXX>。这个列表包含实现接口IXXX ([p1,p2,p3…])的所有类的实例。

var model=new Model();//empty model with input param
foreach(var processor in processors)
{
    processor.Prosess(model);
}

如果你想控制流程顺序,你可以在接口中添加一个方法:

int Order();

和每个类(p1,p2)返回不同的值(1,2)。
然后按这个值排序。进程完成后停止
(比如有p1 p2 p3 p4,当p3做了,有一些条件,就不要做p4)。
您可以在模型中添加bool属性,如DoNext。默认情况下,它应该为false,在p3中,将其更改为true。所以你可以传递左
在foreach{}中,您可以为每个处理器创建一个任务,在不同的线程中运行所有处理器(但我认为这不是管道)。
我不擅长英语。我希望这对你有帮助。

更新:

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。

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容器或使用公共服务定位器