Вопрос

Недавно я решил работать с RX (реактивные расширения) для 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, он висит интерфейс и не идет дальше, чем это. Любые идеи?

Это было полезно?

Решение

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top