Вопрос
У меня есть 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);
Мне нужно запустить их одновременно и присоединиться к конечному результату, результатам обработки и исключения, которые поступают из каждого порта отдельно. Не могли бы вы предложить, как мне это сделать?
Я смог найти только возможность присоединиться к результатам из порта, а не из Portset's.
Спасибо
Решение
Ваше решение несколько ограничено количеством задействованных классов. Я бы предложил активировать 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
}
})