Frage

Vor kurzem habe ich beschlossen, die Arbeit mit Rx (Reactive Extensions) für Windows Phone 7 und begegnete ich einige seltsame Verhalten.

Zum Beispiel, ich habe dieses Stück 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());

Was ich versuche, ist, herauszufinden, warum, wenn ich die LINQ-Abfrage zu erreichen, ist es die Benutzeroberfläche hängt und geht nicht weiter als diese. Irgendwelche Ideen?

War es hilfreich?

Lösung

AFAIK, Anruf zunächst blockiert, so wird die Ausführung erst nach Reaktion Empfang wieder aufgenommen werden. Versuchen Sie ersetzen es mit

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

Andere Tipps

Ich werde in einer weiteren wichtigen Sache, über dieses Szenario werfen. Wie bereits erwähnt, ist es wahr, dass zunächst ein blockierenden Aufruf ist. Um die Kommentar-Adresse, dass die Antwort nicht empfangen wird, wenn zunächst mit (), obwohl, ist es wichtig, in Silverlight zu erkennen, dass der UI-Thread (Dispatcher) wird verwendet, eigentlich, wenn die Netzwerkdaten zu empfangen. Also, indem Sie zunächst blockieren Sie den UI-Thread von Empfangen der Antwort der UI-Thread wartet. In Silverlight ist es wichtig, nie aus irgendeinem Grunde den UI-Thread zu blockieren.

desco korrekt über First() Blockierung. In Rx müssen Sie die Art und Weise reaktiv alle nach unten bleiben, oder Sie werden zu Block irgendwo haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top