Frage
I 4 Dienstleistungen haben, hat jeder eine Methode mit der Signatur wie folgt aus:
PortSet<Response1, Exception> GetData1(Request1 request);
PortSet<Response2, Exception> GetData2(Request2 request);
PortSet<Response3, Exception> GetData3(Request3 request);
PortSet<Response4, Exception> GetData4(Request4 request);
Ich brauche sie gleichzeitig ausgeführt werden und das Endergebnis kommen, Verarbeitungsergebnis und Ausnahme, die separat von jedem Hafen kommt. Könnten Sie bitte empfehlen, wie kann ich das tun?
Ich konnte nur die Möglichkeit finden, die Ergebnisse aus dem Hafen der nicht von PortSet der zu verbinden.
Danke
Lösung
ist Ihre Lösung etwas durch die Anzahl der beteiligten Klassen beschränkt. Ich würde vorschlagen, Choice
Empfänger auf jedem PortSet
zu aktivieren und in jedem Handler auf einen Completion-Port Post
. Auf dem Completion-Port, können Sie eine Join
verwenden, wenn sie alle complete.So, aus der Spitze von meinem Kopf, und vorausgesetzt, Sie von CcrServiceBase
werden Ableiten (sonst müssen Sie Arbiter.Activate
anstelle dem knapperen Activate
verwenden):
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...
}));
Wenn stattdessen Sie hatten eine gemeinsame Response
Art, könnten Sie stattdessen Ihre Anrufe strukturieren wie folgt:
var PortSet<Response,Exception> ps=new PortSet<Response,Exception>();
GetData1(request1,ps);
GetData2(request2,ps);
GetData3(request3,ps);
GetData4(request4,ps);
so statt der GetData
Aufruf einen neuen PortSet
erstellen, geben Sie eine gemeinsame PortSet
und an die GetData
Methoden liefern.
Jetzt können Sie ein mehr Artikel ausführen erhalten:
ps.MultipleItemReceive(4,
responses=> {
foreach(var response in responses)
{
//process response
}
},
exceptions=> {
foreach(var exception in exceptions)
{
//process exception
}
})