我有4个服务,每个服务都有一个带有签名的方法:
PortSet<Response1, Exception> GetData1(Request1 request);
PortSet<Response2, Exception> GetData2(Request2 request);
PortSet<Response3, Exception> GetData3(Request3 request);
PortSet<Response4, Exception> GetData4(Request4 request);
我需要同时运行它们并加入最终结果,分别处理来自每个端口的结果和异常。你能建议我怎么做?
我只能找到加入Port的结果的可能性,而不是来自PortSet的结果。
由于
答案 0 :(得分:0)
您的解决方案受到所涉及的课程数量的限制。我建议在每个Choice
上激活PortSet
个接收器,并在每个处理程序中激活Post
到完成端口。在完成端口上,当它们全部完成时你可以使用Join
。所以,从我的头顶开始,假设你是从CcrServiceBase
派生的(否则你需要使用{{1}而不是terser 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
来创建新的PortSet
,而是将其提供给PortSet
方法。
现在,您可以执行多项收件:
GetData