Наблюдаемый.fromasyncpattern висит интернет-интерфейс
-
29-09-2019 - |
Вопрос
Недавно я решил работать с 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 вам нужно оставаться реактивным до конца вниз, или вам придется где-нибудь заблокировать.