您的解决方案在某种程度上受到所涉及的类数量的限制。我建议在每个和每个处理程序中激活Choice
接收器到完成端口。在完成端口上,当它们全部完成时您可以使用aPortSet
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
调用创建 new PortSet
,而是提供 commonPortSet
并将其提供给GetData
方法。
现在,您可以执行多个项目接收:
ps.MultipleItemReceive(4,
responses=> {
foreach(var response in responses)
{
//process response
}
},
exceptions=> {
foreach(var exception in exceptions)
{
//process exception
}
})