加入CCR中的PortSet

时间:2010-09-15 09:00:19

标签: ccr

我有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的结果。

由于

1 个答案:

答案 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