Ваше решение несколько ограничено числом классов, участвующих. Я предлагаю активировать приемники Choice
на каждом PortSet
и в каждом обработчике до Post
до порта завершения. На порте завершения, вы могли бы использовать Join
, когда они все complete.So, с верхней части моей головы, и предполагается, что вы выводе из CcrServiceBase
(в противном случае вы должны будете использовать Arbiter.Activate
вместо terser 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
}
})
Спасибо за ответ! Да, меня как-то ограничивает количество различных ответов, которые я получаю, и именно поэтому я задал этот вопрос :). К сожалению, я должен придерживаться разных результатов, поскольку они поступают из разных источников (разные даже по своей природе, поскольку некоторые из них будут выполнять веб-запрос, другие будут называть веб-службу, а некоторые - в базу данных). Таким образом, первое решение подходит для меня, спасибо! – Kosau