2012-05-02 3 views
0

Existe-t-il un moyen d'utiliser les méthodes serveur de manière asynchrone dans l'application Windows Phone 7? J'ai une liste de données. Dans la boucle foreach, envoyez une requête au serveur pour chaque donnée mais elles ne sont pas complétées dans l'ordre de mon appel. Comment puis je faire ça?Appel de méthode asynchrone dans Windows Phone 7

Répondre

2

J'ai une liste de données. Dans la boucle foreach, envoyez une requête au serveur pour chaque donnée mais elles ne sont pas complétées dans l'ordre de mon appel. Comment puis je faire ça?

Eh bien, vous pouvez effectivement faire les synchrone - se débarrasser de celui-ci étant une boucle réelle foreach , et au lieu mettre en place les callbacks asynchrones appropriées de sorte que lorsque la première réponse vient, vous envoyer la deuxième demande , etc., jusqu'à ce qu'il n'y ait plus de demandes. (Vous pouvez utiliser un Queue<T> pour mettre en file d'attente les demandes à envoyer.)

0

Ne revenez pas aux modes synchrones simplement parce que quelque chose ne semble pas fonctionner. Il y a de nombreux avantages à travailler dans un monde asynchrone. Il y a aussi des dangers. La clé est de savoir comment éviter ces dangers. Voici un exemple utilisant WebClient qui aura des effets néfastes.

foreach (var item in items) 
{ 
    WebClient client = new WebClient(); 
    client.DownloadStringCompleted += (sender, args) => 
     { 
      item.Stuff = args.Result; 
     }; 
    client.OpenReadAsync(new Uri("http://mydomain.com/stuff")); 
} 

Lorsque le client est retourné, il n'y a aucune garantie que item est le même élément « créé » la demande du client. C'est ce qu'on appelle "l'accès au plus proche". Ce qui signifie simplement que vous pourriez essayer de modifier quelque chose qui n'existe plus ou qui n'est pas le même. La bonne façon d'aborder est de capturer votre article dans le foreach comme tel:

foreach (var item in items) 
{ 
    var internalItem = item; 
    WebClient client = new WebClient(); 
    client.DownloadStringCompleted += (sender, args) => 
     { 
      internalItem.Stuff = args.Result; 
     }; 
    client.OpenReadAsync(new Uri("http://mydomain.com/stuff")); 
} 

Cela garantit que vous utilisez l'élément correct car il a été capturé dans le cadre de l'foreach.