我有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);

我需要同时运行它们,并加入最终结果,处理结果和分别来自每个端口的例外。您能建议我该怎么做吗?

我只能发现加入港口的结果,而不是港口集的结果。

谢谢

有帮助吗?

解决方案

您的解决方案在某种程度上受到涉及的课程数量的限制。我建议激活 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 调用创建新的 PortSet, ,您提供一个共同点 PortSet 并将其提供给 GetData 方法。

现在,您可以执行一个多项目接收:

ps.MultipleItemReceive(4,
    responses=> {
        foreach(var response in responses)
        {
            //process response
        }
    },
    exceptions=> {
        foreach(var exception in exceptions)
        {
            //process exception
        }
    })
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top