Question

J'ai 4 services, chacun a une méthode avec la signature comme ceci:

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

J'ai besoin de les exécuter en même temps et rejoindre le résultat final, le résultat de traitement et d'exception qui provient de chaque port séparément. Pourriez-vous s'il vous plaît suggérer comment dois-je faire cela?

j'ai pu trouver que la possibilité de rejoindre les résultats de son port, pas de son PortSet.

Merci

Était-ce utile?

La solution

Votre solution est quelque peu limitée par le nombre de classes concernées. Je vous suggère d'activer les récepteurs Choice sur chaque PortSet, et dans chaque gestionnaire à Post à un port d'achèvement. Sur le port d'achèvement, vous pouvez utiliser un Join quand ils ont tous complete.So, du haut de ma tête, et en supposant que vous dérivez de CcrServiceBase (sinon vous aurez besoin d'utiliser Arbiter.Activate au lieu du Activate de 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...
}));

Si au contraire, vous aviez un type de Response commun, vous pouvez structurer vos appels au lieu comme suit:

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

donc au lieu de l'appel GetData la création d'une nouvelle PortSet, vous fournir un PortSet commun et le fournir aux méthodes de GetData.

Maintenant, vous pouvez effectuer un élément multiple de réception:

ps.MultipleItemReceive(4,
    responses=> {
        foreach(var response in responses)
        {
            //process response
        }
    },
    exceptions=> {
        foreach(var exception in exceptions)
        {
            //process exception
        }
    })
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top