Ваше решение несколько ограничено количеством участвующих классов.Я бы предложил активировать 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
}
})