1

Je viens de mettre à jour vers .NET 4.5 et je veux profiter des fonctionnalités de la méthode asynchrone. Plus précisément, j'ai une façade qui fait 4 appels api différents et regroupe les réponses dans un seul objet de réponse qui sera renvoyé par mon contrôleur. Comme ces 4 appels ne sont pas liés, ils peuvent être exécutés de manière asynchrone et s'exécuter en parallèle. J'ai vu des exemples de contrôleurs asynchrones, mais je veux que les appels parallèles se produisent dans la classe de façade elle-même. Voilà ce que j'ai jusqu'ici:Façade de service asynchrone dans .NET 4.5

En Facade.cs:

public async Task<Dictionary<string, object>> AggregateServiceResponses(string authTicket) 
    { 
     var aggregateServiceResponse = new Dictionary<string, object>(); 
     var asyncManager = new AsyncManager(); 

     asyncManager.OutstandingOperations.Increment(4); 

     await Task<Dictionary<string, object>>.Factory.StartNew(() => 
      { 
       return _membershipServiceManager.GetMemberResponse(authTicket); 
      }).ContinueWith(t => 
       { 
        asyncManager.Parameters["memberInfoResponse"] = t.Result; 
        asyncManager.OutstandingOperations.Decrement(); 
      }); 


     await Task<KeywordingResponseObject[]>.Factory.StartNew(() => 
      { 
       return _keywordingServiceManager.GetKeywordResponse(); 
      }).ContinueWith(t => 
     { 
      asyncManager.Parameters["Keywords"] = t.Result; 
      asyncManager.OutstandingOperations.Decrement(); 
     }); 


     await Task<FamilyResponseObject[]>.Factory.StartNew(() => 
     { 
      return _familyServiceManager.GetFamilyResponse(); 
     }).ContinueWith(t => 
     { 
      asyncManager.Parameters["Family"] = t.Result; 
      asyncManager.OutstandingOperations.Decrement(); 
     }); 


     await Task<IEnumerable<Friends>>.Factory.StartNew(() => 
     { 
      return _friendsServiceManager.GetFriendsResponse(); 
     }).ContinueWith(t => 
     { 
      asyncManager.Parameters["Friends"] = t.Result; 
      asyncManager.OutstandingOperations.Decrement(); 
     }); 

     //After all service calls complete...build composite response... 

     aggregateServiceResponse.Add("MemberInformation",asyncManager.Parameters["memberInfoResponse"]); 
     aggregateServiceResponse.Add("Keywords", asyncManager.Parameters["Keywords"]); 
     aggregateServiceResponse.Add("Family", asyncManager.Parameters["Family"]); 
     aggregateServiceResponse.Add("Friends",asyncManager.Parameters["Friends"]); 

     return aggregateServiceResponse; 
    } 
+2

Quelle est votre question? –

Répondre

4

Vous pouvez le faire en même temps en tant que tel:

var memberTask = Task.Run(() => ...); 
var kewordTask = Task.Run(() => ...); 
var familyResponseTask = Task.Run(() => ...); 
var friendsTask = Task.Run(() => ...); 

await Task.WhenAll(memberTask, keywordTask, familyResponseTask, friendsTask); 

Cependant, je dois souligner que parallèle (CPU- Le traitement sur ASP.NET n'est pas recommandé sauf si vous écrivez un service interne uniquement avec seulement une poignée de requêtes utilisateur simultanées. Vous n'avez plus besoin d'utiliser AsyncManager (ou AsyncController).

+0

Parfait! Il communique uniquement avec les API internes d'une application intranet, de sorte que l'échelle n'est pas très préoccupante. Merci! – AesopWaits