Асинхронный веб-клиент такой медленный?

Я играю с самым простым случаем использования bcl.async in wp7.

private async void loadButton_Click1(object sender, RoutedEventArgs e)
{
        var client = new WebClient(); 
        string response = await client.DownloadStringTaskAsync(new Uri("myurl"));
        Debug.WriteLine(response);
}

Итак, у меня есть точки останова в первой и последней строках, работающие на устройстве в режиме отладки. Иногда для получения ответа требуется около 5 секунд (что странно), но иногда это занимает почти минуту. За 1 запрос с устройства успеваю проверить запрос в браузере (получаю мгновенный ответ, меньше секунды), попить чаю и проверить 9gag.

Я могу предположить, что у меня плохая сеть, но запрос браузера световой, так что это не проблема. Кроме того, я пробовал RestSharp, но столкнулся с той же проблемой. Неасинхронные вызовы WebClient работают нормально.

РЕДАКТИРОВАТЬ: БЫСТРОЕ РЕШЕНИЕ: самое первое, что вам нужно сделать, это перезагрузить устройство.


person Vitalii Vasylenko    schedule 01.05.2013    source источник
comment
Я предлагаю провести тестирование с известным URL-адресом (например, http://www.google.com) — просто чтобы убедиться, что проблема в вашем коде. После этого я бы попробовал использовать старомодный асинхронный веб-запрос (без использования async и await) — опять же, просто для уверенности.   -  person SimpleVar    schedule 01.05.2013
comment
Попробуйте использовать это предложение по следующей ссылке [1] [1]: stackoverflow.com/questions/4932541/   -  person Uzzy    schedule 01.05.2013
comment
@Uzzy Звучит хорошо, но у wp нет свойства Proxy.   -  person Vitalii Vasylenko    schedule 01.05.2013
comment
@YoryeNathan Только что попробовал тот же код с google.com, получил ответ через 5-7 секунд.   -  person Vitalii Vasylenko    schedule 01.05.2013
comment
@VitaliiVasylenko Попробуйте другое мое предложение. Кроме того, если вас не волнует ход загрузки, вы можете самостоятельно управлять ее асинхронностью с помощью простой многопоточности и тем самым избежать использования асинхронного метода.   -  person SimpleVar    schedule 01.05.2013
comment
@YoryeNathan yyeeee, я могу ... но я устал от бесконечных комбинированных и вложенных обратных вызовов и сейчас пытаюсь перевести проект на асинхронность.   -  person Vitalii Vasylenko    schedule 01.05.2013
comment
@VitaliiVasylenko Это, даже временно, может помочь нам найти проблему. Если мы увидим, что old-school-async отлично работает для вас, вы можете смело отправлять отчет об ошибке в Microsoft.   -  person SimpleVar    schedule 01.05.2013
comment
@YoryeNathan Я все еще надеюсь, что какой-нибудь фокус поможет (например, упомянутый client.Proxy = null;): я не думаю, что я первый, кто столкнулся с этим.   -  person Vitalii Vasylenko    schedule 01.05.2013
comment
Я думаю, что HttpClient лучше справляется с асинхронной работой...   -  person Jammer    schedule 01.05.2013
comment
@Jammer спасибо, поэтому я сделаю новое чистое решение и протестирую оба   -  person Vitalii Vasylenko    schedule 01.05.2013


Ответы (1)


Как я уже упоминал в комментарии, я думаю, что стоит изучить использование HttpClient, а не WebClient. HttpClient новее и разработан с учетом нового WebAPI, и я считаю, что он предназначен для работы с большей эффективностью в целом.

здесь есть хорошее сравнение.

person Jammer    schedule 01.05.2013
comment
Спасибо за сравнительную таблицу, но, похоже, HttpClient недоступен в wp7. Есть HttpWebRequest, это то же самое, о чем вы говорите? - person Vitalii Vasylenko; 01.05.2013
comment
Действительно, HttpClient использует HttpWebRequest и HttpWebResponse под капотом. Я не тратил время на изучение материала WP7, поэтому прошу прощения за эту оплошность с моей стороны. - person Jammer; 01.05.2013
comment
Есть кое-что о HttpWebRequest (последний ответ) - person Vitalii Vasylenko; 01.05.2013
comment
Да, но еще нужны тесты. Кроме того, здесь хороший (и актуальный) пример использования асинхронного HttpWebRequest - person Vitalii Vasylenko; 01.05.2013
comment
Нет, извините, но проблема не решена. Я попробовал этот код в очень чистом проекте (проект wp7 + bcl.async): pastebin.com/hdiQv7tw, и он вернул 1: 46748 2: 46714 на раздел. Все еще что-то не так: загрузка контента на устройство заняла 46 секунд, в то время как я смог мгновенно открыть Google в своем браузере. - person Vitalii Vasylenko; 01.05.2013
comment
Это странно, я не уверен, что это просто проблема, связанная с кодом, если честно. Если другие делают это с успехом, используя те же классы, я бы сказал, что проблема заключается в другом. У вашего телефона хорошее подключение, используют ли браузер и телефон одно и то же подключение (например, одно и то же подключение Wi-Fi)? - person Jammer; 01.05.2013
comment
Единственное, что я имею в виду, так это то, что причина в энергосбережении телефона. Тестирование еще продолжается. PS: кстати, HttpClient действительно немного быстрее :) - person Vitalii Vasylenko; 01.05.2013
comment
Это вполне может негативно сказаться на нем. Да, это точно быстрее :) - person Jammer; 01.05.2013
comment
Похоже на проблему с асинхронностью :(((( Просто запустите старый добрый обратный вызов и асинхронный вызов, обратный вызов намного быстрее 0_0 Но это не должно быть быстрее - person Vitalii Vasylenko; 01.05.2013
comment
Хм, в этой ветке Тео можно многое перенять. Боюсь, у меня закончились предложения. :( - person Jammer; 01.05.2013
comment
Как обычно в Windows, перезагрузка телефона решила все проблемы со странным поведением :) - person Vitalii Vasylenko; 01.05.2013
comment
Ха-ха! Если сомневаетесь... рад, что вы разобрались. Интересно, о чем wp7 кашлял? - person Jammer; 01.05.2013
comment
Как обычно, ни у кого нет идей (может быть, кроме некоторых техлидов в MS). :) Но теперь я получаю ответы от сервера достаточно быстро (за несколько секунд... все же медленнее, чем браузер, но намного лучше, чем 40). - person Vitalii Vasylenko; 01.05.2013
comment
Я думаю, сложно сравнивать настольный браузер с телефоном. Это как сравнивать яблоки и апельсины. В конце концов, это разные звери, если они сопоставимы, что сейчас кажется, я бы сказал, что это победа. - person Jammer; 01.05.2013
comment
На самом деле, нет... скажем, телефонный браузер довольно быстрый и довольно быстро загружает stackoverflow.com (только что проверил, никогда раньше не посещал). Конечно, мы не можем сравнивать скорость ПК и устройства напрямую, но я не вижу 3-секундной задержки перед началом загрузки страницы на устройстве. - person Vitalii Vasylenko; 01.05.2013
comment
Я хочу сказать, что на самом деле задействовано так много переменных, что сравнение их напрямую само по себе не является прямым. Много факторов, которые нужно учитывать, я думаю. - person Jammer; 01.05.2013
comment
В порядке. Давайте изменим формулировку :) Я имею в виду, что в браузере устройства нет 3-секундной задержки перед началом отображения данных. Находясь в приложении моего устройства, я вижу эту задержку. - person Vitalii Vasylenko; 01.05.2013
comment
Звучит правдоподобно, но у меня нет кода в этом проекте :) Просто чистый проект WP 7 + bcl.async. Рассматриваю только аппаратные проблемы: неотформатированный диск или еще какая-то хрень. Я также пробовал режим выпуска, поэтому я думаю, что это аппаратные проблемы устройства. - person Vitalii Vasylenko; 01.05.2013
comment
Это по меньшей мере раздражает. - person Jammer; 01.05.2013