管道处理引擎
本文关键字:引擎 处理 管道 | 更新日期: 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容器或使用公共服务定位器