Domanda

Ho 4 servizi, ognuno ha un metodo con la firma in questo modo:

PortSet<Response1, Exception> GetData1(Request1 request);
PortSet<Response2, Exception> GetData2(Request2 request);
PortSet<Response3, Exception> GetData3(Request3 request);
PortSet<Response4, Exception> GetData4(Request4 request);

Ho bisogno di eseguirli contemporaneamente e unire il risultato finale, l'elaborazione di risultato ed eccezione che viene da ciascuna porta separatamente. La prego di suggerire come faccio a fare questo?

sono stato in grado di trovare solo la possibilità di unire i risultati dal porto di, non dal Portset di.

Grazie

È stato utile?

Soluzione

La vostra soluzione è un po 'limitato per il numero di classi coinvolte. Io suggerirei di attivare i ricevitori Choice su ogni PortSet, ed in ogni gestore per Post a una porta di completamento. Sulla porta di completamento, è possibile utilizzare un Join quando tutti complete.So, al largo della parte superiore della mia testa, e supponendo che si sta derivanti da CcrServiceBase (altrimenti avrete bisogno di utilizzare Arbiter.Activate al posto del Activate terser):

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...
}));

Se invece si ha un tipo di Response comune, si potrebbe invece strutturare le chiamate nel seguente modo:

var PortSet<Response,Exception> ps=new PortSet<Response,Exception>();
GetData1(request1,ps);
GetData2(request2,ps);
GetData3(request3,ps);
GetData4(request4,ps);

così invece della chiamata GetData creazione di un nuovo PortSet, è fornire un PortSet comune e fornire ai metodi GetData.

Ora, è possibile eseguire un oggetto di multiplo di ricezione:

ps.MultipleItemReceive(4,
    responses=> {
        foreach(var response in responses)
        {
            //process response
        }
    },
    exceptions=> {
        foreach(var exception in exceptions)
        {
            //process exception
        }
    })
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top