Observable.FromAsyncPattern挂起UI

时间:2010-11-05 09:02:32

标签: .net windows-phone-7 system.reactive observable

最近我决定使用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并且不会比这更进一步。有什么想法吗?

3 个答案:

答案 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中你需要一直保持反应,否则你将不得不在某个地方阻挡。