Pregunta
Tengo 4 servicios, cada uno tiene un método con la firma de esta manera:
PortSet<Response1, Exception> GetData1(Request1 request);
PortSet<Response2, Exception> GetData2(Request2 request);
PortSet<Response3, Exception> GetData3(Request3 request);
PortSet<Response4, Exception> GetData4(Request4 request);
necesito para ejecutar concurrentemente y unirse al resultado final, el procesamiento y el resultado excepción que proviene de cada puerto por separado. Podría sugerir cómo hago esto?
I fue capaz de encontrar única posibilidad de unirse a los resultados del puerto de, no a partir de PortSet.
Gracias
Solución
Su solución es un tanto limitada por el número de clases involucradas. Yo te sugeriría que la activación de los receptores Choice
en cada PortSet
, y en cada controlador de Post
a un puerto de finalización. En el puerto de finalización, se puede utilizar un Join
cuando todos complete.So, la parte superior de mi cabeza, y suponiendo que se derivan de CcrServiceBase
(de lo contrario tendrá que utilizar Arbiter.Activate
en lugar de la Activate
más concisa):
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...
}));
Si por el contrario usted tenía un tipo Response
común, en su lugar podría estructurar sus llamadas de la siguiente manera:
var PortSet<Response,Exception> ps=new PortSet<Response,Exception>();
GetData1(request1,ps);
GetData2(request2,ps);
GetData3(request3,ps);
GetData4(request4,ps);
Así que en lugar de la llamada GetData
la creación de una nueva PortSet
, que proporcionan una PortSet
común y suministrarla a los métodos GetData
.
Ahora, puede realizar un elemento de múltiples recibir:
ps.MultipleItemReceive(4,
responses=> {
foreach(var response in responses)
{
//process response
}
},
exceptions=> {
foreach(var exception in exceptions)
{
//process exception
}
})