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

¿Fue útil?

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
        }
    })
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top