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

War es hilfreich?

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
        }
    })
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top