最近,我决定与Windows Phone 7的RX(反应性扩展)合作,并遇到了一些奇怪的行为。

例如,我有这个代码:

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,并且不会进一步发展。有任何想法吗?

有帮助吗?

解决方案

AFAIK,首先打电话是阻止的,因此只有在收到响应后才能恢复执行。尝试用

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

其他提示

我将在这种情况下更重要的一件事。如前所述,首先是阻止调用。为了解决以下评论,即使用first()时永远不会收到响应,在Silverlight中意识到,在接收网络数据时实际使用了UI线程(调度程序)。因此,通过首先使用,您可以阻止UI线程接收响应UI线程正在等待。在Silverlight中,至关重要的是,不要出于任何原因永远不会阻止UI线程。

Desco是正确的 First() 阻止。在RX中,您需要一直保持反应性,否则您必须阻止某个地方。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top