题
我有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
}
})
不隶属于 StackOverflow