2010-09-20 7 views
1

J'ai une application MVC (s'applique également à un environnement non MVC) lorsqu'un utilisateur poste des données. J'ai besoin de prendre ces données, l'envoyer à deux points d'extrémité séparés (l'un en utilisant un formulaire WebRequest POST et l'autre en utilisant un service Web), analyser le résultat et renvoyer le résultat à l'utilisateur d'origine. Le problème est que les deux extrémités prennent environ 20 à 30 secondes pour répondre (la réponse est une chaîne de caractères), ce qui signifie que je devrais probablement exécuter ces deux appels de manière asynchrone. Dans le même temps, je veux attendre de répondre à l'utilisateur d'origine jusqu'à ce que je reçois les deux résultats. Je suppose que je devrais utiliser une sorte de verrouillage d'objet afin que la réponse ne soit pas renvoyée avant que les deux appels soient terminés?WebRequest et WebService appellent de manière asynchrone en C#

Suis-je sur le bon chemin? Quelqu'un at-il des informations sur la façon d'y parvenir? Toute aide est appréciée.

Merci

EDIT

D'après les réponses que j'ai décidé d'aller avec les contrôleurs depuis async je travaille déjà avec une application MVC. Merci pour votre participation.

Répondre

1

Vous pouvez appeler Join sur les deux threads asynchrones pour attendre leur retour. Vous voudrez également regarder dans les contrôleurs asynchrones. Ceci est disponible dans MVC2 mais vous pouvez également regarder les fonctionnalités MVC1 que je crois implémenter des actions asynchrones. Vous devez le faire pour ne pas bloquer IIS en traitant plus de threads.

0

Je pense que vous trouverez ce utile: Rx: Piecing together multiple IObservable web requests

En particulier, en utilisant ForkJoin attendre jusqu'à ce que les réponses reviennent comme mentionné dans les commentaires:

question bonus En outre, il y a un cas où je voudrais exécuter des appels Web simultanément et quand tous sont terminés exécuter une autre observable qui sera jusqu'à ce que les autres appels sont terminés.

Utilisez Observable.ForkJoin pour exécuter plusieurs appels simultanément async puis rejoindre tous les résultats dans un seul IObservable. Ensuite, utilisez SelectMany (un autre de déclaration) juste comme ci-dessus, pour vous abonner à un autre observable basé sur le résultat joint.

Questions connexes