您的解决方案受到所涉及的类的数量的限制。我建议激活
Choice
每个接收器
PortSet
Post
到一个完工港。在完成端口上,您可以使用
Join
当他们都完成了。所以呢从我的头顶上,假设你是从
CcrServiceBase
Arbiter.Activate
而不是更简洁
Activate
):
var cPort=new Port<EmptyValue>();
Activate(GetData1(myRequest1)
.Choice(r1=>{
Process(r1);
cPort.Post(EmptyValue.SharedInstance);
},ex=>{
Process(ex);
cPort.Post(EmptyValue.SharedInstance);
}); //etc 4 times
Activate(cPort.Join(4,e=>{
//all completed. Proceed here...
}));
如果你有一个共同的
Response
键入,则可以按以下方式构造调用:
var PortSet<Response,Exception> ps=new PortSet<Response,Exception>();
GetData1(request1,ps);
GetData2(request2,ps);
GetData3(request3,ps);
GetData4(request4,ps);
所以不是
GetData
端口集
端口集
并提供给
方法。
现在,您可以执行多项目接收:
ps.MultipleItemReceive(4,
responses=> {
foreach(var response in responses)
{
//process response
}
},
exceptions=> {
foreach(var exception in exceptions)
{
//process exception
}
})