Question

Récemment, je décidé de travailler avec Rx (Reactive Extensions) pour Windows Phone 7 et je rencontrais un comportement bizarre.

Par exemple, j'ai ce morceau de code:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://whatismyip.org/");
request.Method = "GET";

var x = from c in Observable.FromAsyncPattern<WebResponse>(request.BeginGetResponse, request.EndGetResponse)()
            select c;

WebResponse r = x.First();
Debug.WriteLine(r.ContentType.ToString());

Ce que je suis en train de comprendre pourquoi quand je tends la requête LINQ, il se bloque l'interface utilisateur et ne va pas plus loin que cela. Toutes les idées?

Était-ce utile?

La solution

AFAIK, appel à d'abord bloque, donc l'exécution sera reprise qu'après réception de la réponse. Essayez de le remplacer par

x.Take(1).Subscribe(r => Debug.WriteLine(r.ContentType.ToString()));

Autres conseils

Je vais jeter dans une chose plus importante à ce scénario. Comme indiqué plus haut, il est vrai que d'abord est un appel de blocage. Pour répondre à ce commentaire que la réponse est jamais reçue lors de l'utilisation d'abord () cependant, il est important de réaliser dans Silverlight que le thread d'interface utilisateur (Dispatcher) est effectivement utilisé lors de la réception des données du réseau. Ainsi, en utilisant d'abord, vous bloquer le thread d'interface utilisateur de recevoir la réponse du thread d'interface utilisateur est en attente sur. Dans Silverlight il est essentiel de ne jamais bloquer le thread d'interface utilisateur pour une raison quelconque.

Desco est correct sur le blocage de First(). Rx vous devez rester réactif tout en bas ou vous devrez bloc quelque part.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top