0

最近我决定为 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,并且不会比这更进一步。有任何想法吗?

4

3 回答 3

5

AFAIK,对 First 的调用是阻塞的,因此只有在收到响应后才会恢复执行。尝试将其替换为

x.Take(1).Subscribe(r => Debug.WriteLine(r.ContentType.ToString()));
于 2010-11-05T09:27:15.010 回答
3

关于这种情况,我将提出一件更重要的事情。如前所述,确实 First 是一个阻塞调用。但是,为了解决使用 First() 时从未收到响应的评论,重要的是要在 Silverlight 中实现在接收网络数据时实际使用 UI 线程 (Dispatcher)。因此,通过使用 First,您可以阻止 UI 线程接收 UI 线程正在等待的响应。在 Silverlight 中,永远不要以任何理由阻塞 UI 线程,这一点至关重要。

于 2011-01-04T22:39:27.673 回答
1

desco 关于First()阻塞是正确的。在 Rx 中,您需要一直保持被动,否则您将不得不在某个地方阻塞。

于 2010-11-05T11:44:57.043 回答