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