0

最近、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 がハングし、これ以上進まない理由です。何か案は?

4

3 に答える 3

5

私の知る限り、 First への呼び出しはブロックされているため、応答を受信した後にのみ実行が再開されます。で置き換えてみてください

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

このシナリオについて、もう 1 つ重要なことがあります。既に述べたように、First がブロッキング コールであることは事実です。ただし、First() を使用すると応答が受信されないというコメントに対処するには、ネットワーク データを受信するときに UI スレッド (Dispatcher) が実際に使用されることを Silverlight で認識することが重要です。そのため、First を使用することで、UI スレッドが待機している応答を UI スレッドが受信するのをブロックします。Silverlight では、何らかの理由で UI スレッドを決してブロックしないことが重要です。

于 2011-01-04T22:39:27.673 に答える
1

descoはFirst()ブロッキングについて正しいです。Rxでは、ずっと反応性を保つ必要があります。そうしないと、どこかでブロックする必要があります。

于 2010-11-05T11:44:57.043 に答える