Domanda

Recentemente ho deciso di lavorare con Rx (Reactive Extensions) per Windows Phone 7 e ho incontrato alcuni comportamenti strani.

Per esempio, io ho questo pezzo di codice:

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

Quello che sto cercando di capire è il motivo per cui quando raggiungo la query LINQ, si blocca l'interfaccia utente e non va oltre questo. Tutte le idee?

È stato utile?

Soluzione

AFAIK, chiamata a First si blocca, quindi l'esecuzione riprenderà solo dopo aver ricevuto risposta. Prova sostituirlo con

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

Altri suggerimenti

mi butto in una cosa più importante di questo scenario. Come già notato, è vero che la prima è una chiamata di blocco. Per affrontare il commento che la risposta non viene mai ricevuto quando si utilizza First (), però, è importante rendersi conto in Silverlight che il thread UI (Dispatcher) è effettivamente utilizzato per la ricezione dei dati di rete. Quindi, utilizzando in primo luogo, si blocca il thread dell'interfaccia utente di ricevere la risposta thread UI è in attesa. In Silverlight è fondamentale per non bloccare il thread UI per qualsiasi motivo.

desco è corretta su First() blocco. In Rx è necessario rimanere reattiva fino in fondo o si dovrà blocco da qualche parte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top