P1---->P2----->(output 1)
P1---->P3---->(output 2)
(output 1) + (output 2) ---->P4P1进程执行,P1输出作为输入输入到P2进程中。P2也将执行。只有当P4 & P2 & P3完成过程时,才能启动。P4进程不会启动,因为输入进程P3尚未处理(P2输入现在可用)。
任何将触发P4执行进程的输入参数触发机制。我需要任何标准的设计模式或样本代码(C#)来解决上述问题。
还需要在.net 3.5框架中执行进程并行的任何标准方法。
发布于 2015-07-31 10:14:55
有一天我一直在考虑这个问题。
首先,创建一个接口:
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{}中,您可以为每个prossecor创建一个任务,在不同的线程中运行所有处理器(但我认为这不是一个管道)。
我不擅长英语。我希望这能帮到你。
更新:
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容器或使用公共服务定位器。
https://stackoverflow.com/questions/31696383
复制相似问题