0

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

谢谢

4

1 回答 1

0

您的解决方案在某种程度上受到所涉及的类数量的限制。我建议在每个和每个处理程序中激活Choice接收器到完成端口。在完成端口上,当它们全部完成时您可以使用aPortSetPostJoinCcrServiceBaseArbiter.ActivateActivate

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
        }
    })
于 2010-09-20T01:15:04.207 回答