2009-12-17 4 views
3

Je développe une application Silverlight qui effectue plusieurs requêtes asynchrones vers un certain nombre de services Web. Je veux qu'une boîte de dialogue "chargement" modale reste active jusqu'à ce que toutes les demandes soient terminées. Je gère la situation en utilisant une variable de compteur qui s'incrémente à chaque événement de démarrage de demande asynchrone, et décrémente chaque événement asynchrone complet (cela ne semble pas sûr pour moi). Lorsque le compteur est zéro, une propriété liée à l'interface utilisateur désactive la boîte de dialogue. Y a-t-il une meilleure façon/plus générale de traiter ce problème que ma contre-solution?Synchronisation de plusieurs requêtes asynchrones

Répondre

0

Votre solution de compteur est valide. Quoi que vous fassiez, vous devrez garder une trace de toutes vos demandes et comprendre quand elles arrivent (lorsque le compte atteint zéro).

Vous pouvez faire différentes choses pour nettoyer votre code comme mettre toute cette implémentation dans une classe MultiAsyncWaiter qui renvoie un événement une fois terminé. Mais l'implantation fondamentale restera la même: gardez la trace jusqu'à ce qu'ils reviennent tous.

Vous avez raison au sujet de la sécurité de l'int. Si vous utilisez des opérations imbriquées (voir les commentaires) ou verrouillez la variable, vous pouvez conserver votre thread d'implémentation en toute sécurité.

Pourquoi le mot clé volatile ne fonctionne pas: Avec plusieurs threads modifiant la variable, une opération de verrouillage est nécessaire pour la décrémentation, qui est techniquement une opération de lecture et d'écriture. C'est parce qu'un autre thread peut changer la valeur entre la lecture et l'écriture.

+1

Il ne suffit pas de rendre l'int volatile - vous devez utiliser Interlocked.Increment et .Decrement pour vous assurer de ne pas perdre les mises à jour (http://msdn.microsoft.com/fr-fr/library/dd78zt0c .aspx) –

+0

merci, mise à jour de la réponse. – santosc

+0

Merci pour la réponse; J'ai découvert le framework Rx livré avec Silverlight et utilisé la méthode ForkJoin() sur l'interface IObservable pour cela (ce qui est assez étonnant, allez voir http://www.minddriven.de/?p=563&cpage= 1 # commentaire-4425) – gn22

Questions connexes