最近我决定使用Windows Phone 7的Rx(Reactive Extensions),我遇到了一些奇怪的行为。
例如,我有这段代码:
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());
我想弄清楚的是,为什么当我到达LINQ查询时,它会挂起UI并且不会比这更进一步。有什么想法吗?
答案 0 :(得分:5)
AFAIK,对First的调用是阻塞,因此只有在收到响应后才会恢复执行。 尝试用
替换它x.Take(1).Subscribe(r => Debug.WriteLine(r.ContentType.ToString()));
答案 1 :(得分:3)
我会在这个场景中提出一个更重要的事情。如前所述,First是阻塞调用。为了解决在使用First()时从未收到响应的注释,在Silverlight中实现UI线程(Dispatcher)在接收网络数据时实际使用是很重要的。因此,通过使用First,您可以阻止UI线程接收UI线程正在等待的响应。在Silverlight中,永远不会因任何原因阻止UI线程至关重要。
答案 2 :(得分:1)
desco对于First()
阻止是正确的。在Rx中你需要一直保持反应,否则你将不得不在某个地方阻挡。