Pregunta

Recientemente decidí trabajar con Rx (Reactive extensiones) para Windows Phone 7 y me encontré con un comportamiento extraño.

Por ejemplo, tengo esta pieza de código:

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());

Lo que estoy tratando de averiguar eso, cuando llego a la consulta LINQ, se cuelga la interfaz de usuario y no va más allá de esto. Algunas ideas?

¿Fue útil?

Solución

Que yo sepa, llamada a Primera es el bloqueo, lo que la ejecución se reanudará sólo después de haber recibido la respuesta. Pruebe reemplazarlo con

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

Otros consejos

Me va a lanzar en una cosa más importante acerca de este escenario. Como ya se ha señalado, es cierto que la primera es una llamada de bloqueo. Para abordar el comentario de que la respuesta no se recibe cuando se utiliza primero () sin embargo, es importante darse cuenta de Silverlight que el hilo de interfaz de usuario (Dispatcher) se utiliza realmente cuando se reciben los datos de la red. Así mediante el uso En primer lugar, se bloquea el hilo de interfaz de usuario desde la recepción de la respuesta del hilo de interfaz de usuario está esperando. En Silverlight es fundamental para no bloquear el hilo de interfaz de usuario por cualquier razón.

desco es correcta sobre el bloqueo de First(). En Rx que tenga que permanecer reactiva todo el camino o tendrás al bloque de alguna parte.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top