J'écris un service Web ASP.NET en utilisant C# qui a une fonction DoLookup(). Pour chaque appel à la fonction DoLookup(), j'ai besoin de mon code pour exécuter deux requêtes distinctes: l'une vers un autre service Web sur un site distant et l'autre vers une base de données locale. Les deux requêtes doivent se terminer avant que je puisse compiler les résultats et les renvoyer comme réponse à la méthode DoLookup. Le problème auquel je suis confronté est que je veux rendre ceci aussi efficace que possible, à la fois en termes de temps de réponse et d'utilisation des ressources sur le serveur web. Nous attendons jusqu'à plusieurs milliers de requêtes par heure. Voici un aperçu C# -comme approximative de ce que j'ai jusqu'à présent:Optimisation d'un service Web ASMX avec plusieurs opérations de longue durée
public class SomeService : System.Web.Services.WebService
{
public SomeResponse DoLookup()
{
// Do the lookup at the remote web service and get the response
WebResponse wr = RemoteProvider.DoRemoteLookup();
// Do the lookup at the local database and get the response
DBResponse dbr = DoDatabaseLookup();
SomeResponse resp = new SomeResponse(wr, dbr);
return resp;
}
}
Le code ci-dessus fait tout de manière séquentielle et fonctionne très bien, mais maintenant je veux le rendre plus évolutif. Je sais que je peux appeler la fonction DoRemoteLookup() de manière asynchrone (RemoteProvider a des méthodes BeginRemoteLookup/EndRemoteLookup) et que je peux aussi effectuer la recherche de base de données de manière asynchrone en utilisant les méthodes BeginExecuteNonQuery/EndExecuteNonQuery.
Ma question (enfin) est la suivante: comment puis-je déclencher à la fois la recherche de service web ET la recherche de base de données simultanément sur des threads séparés et s'assurer qu'ils ont tous deux terminé avant de renvoyer la réponse? La raison pour laquelle je veux exécuter les deux requêtes sur des threads séparés est qu'elles ont toutes les deux potentiellement de longs temps de réponse (1 ou 2 secondes) et que je voudrais libérer les ressources du serveur web pour gérer d'autres requêtes pendant qu'il attend des réponses. Une note supplémentaire - J'ai la recherche de service Web à distance fonctionnant de manière asynchrone actuellement, je ne voulais juste pas rendre l'exemple ci-dessus trop confus. Ce que je lutte avec est d'obtenir à la fois la recherche de service à distance et la recherche de base de données a commencé en même temps et de déterminer quand ils ont terminé à la fois.
Merci pour vos suggestions.
Avez-vous des threads fonctionnant dans un service Web? Threading dans le web quoi que ce soit est très limité sur la plate-forme. Net .. –
@Charles Conway: Avez-vous lu l'une des réponses ci-dessous? De quoi parlez-vous, "limité"? –