Observable.FromAsyncPattern висит пользовательский интерфейс - PullRequest
0 голосов
/ 05 ноября 2010

Недавно я решил поработать с Rx (Reactive Extensions) для Windows Phone 7, и я столкнулся со странным поведением.

Например, у меня есть этот кусок кода:

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, он зависает в пользовательском интерфейсе и не идет дальше этого. Есть идеи?

Ответы [ 3 ]

5 голосов
/ 05 ноября 2010

AFAIK, вызов First блокируется, поэтому выполнение будет возобновлено только после получения ответа.Попробуйте заменить его на

x.Take(1).Subscribe(r => Debug.WriteLine(r.ContentType.ToString()));
3 голосов
/ 05 января 2011

Я добавлю еще одну важную вещь об этом сценарии. Как уже отмечалось, это правда, что First - это блокирующий вызов. Чтобы ответить на комментарий, что ответ никогда не получен при использовании First (), важно понимать в Silverlight, что поток пользовательского интерфейса (Dispatcher) фактически используется при получении сетевых данных. Таким образом, используя First, вы блокируете поток пользовательского интерфейса от получения ответа, которого ожидает поток пользовательского интерфейса. В Silverlight важно никогда не блокировать поток пользовательского интерфейса по любой причине.

1 голос
/ 05 ноября 2010

деско правильно о блокировке First(). В Rx вы должны оставаться реактивными до конца или вам придется где-то блокировать.

...