質問

最近、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を掛けて、これ以上進まない理由です。何か案は?

役に立ちましたか?

解決

AFAIK、最初に電話がブロックされているため、応答を受け取った後にのみ実行が再開されます。置き換えてみてください

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

他のヒント

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

デスコは正しいです First() ブロッキング。 RXでは、リアクティブをずっと下に保つ必要があります。そうしないと、どこかをブロックする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top