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