appeso Observable.FromAsyncPattern l'interfaccia utente
-
29-09-2019 - |
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?
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.