Использовать Windows Phone ProgressBar, пока не закончится загрузка HttpWebRequest? - PullRequest
1 голос
/ 30 марта 2011

Я загружаю 2 файла XML с кодом ниже:

    public static string GetXMLString()
    {
        try
        {
            var request = (HttpWebRequest)WebRequest.Create(new Uri(@"http://www.example.com/data/xml/2.0/"));request.BeginGetResponse(r =>
            {
                try
                {
                    var httpRequest = (HttpWebRequest)r.AsyncState;
                    var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(r);

                    using (var reader = new StreamReader(httpResponse.GetResponseStream()))
                    {
                        var response = reader.ReadToEnd();

                        xmlKolosej = response.ToString();
                    }
                }
                catch (Exception)
                {
                    xml = null;
                }
            }, request);
        }
        catch (Exception)
        {
            xml = null;
        }

        return xml;
    }

Код вызывается через 2 идентичных метода, как указано выше (2 разных файла XML для загрузки с разных URI). Оба метода вызываются последовательно при загрузке страницы Windows Phone. Иногда, когда у меня плохое беспроводное соединение, загрузка обычно занимает некоторое время. Мне было интересно, как я смогу проверить, завершил ли HttpWebRequest загрузку файлов и запустить ProgressBar, пока он не закончил загрузку? Возможно, вы предлагаете другой подход к проблеме?

РЕДАКТИРОВАТЬ - Дополнительная информация: Причина, по которой мне нужно иметь индикатор выполнения, заключается в том, что данные необходимы для того, чтобы пользователь продвинулся вперед. Если пользователь попытается перейти в приложение, и у него плохое беспроводное соединение, а данные все еще загружаются, метод, конечно, вернет ноль. Таким образом, индикатор выполнения блокирует пользователя из приложения, пока оно не завершит загрузку.

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Это не может быть ваш реальный код, поскольку запросы асинхронны, и этот код сначала не будет компилироваться, поскольку xml не определен, а во-вторых, всегда будет возвращать ноль, поскольку метод будет возвращаться до выполнения запроса.

Несмотря на это, способ обработки индикатора выполнения по нескольким запросам заключается в том, чтобы на моем ViewModel был счетчик, который я увеличивал, когда что-то начинает какую-то работу, и уменьшал, когда что-то заканчивал. Затем я привязываю свой индикатор выполнения к показу, когда счетчик> 0.

Также обязательно используйте PerformaceProgressBar с http://silverlight.codeplex.com/

0 голосов
/ 30 марта 2011

Крис прав, что код недействителен и не будет работать на WP7.Вот некоторый код, который должен был бы:

private void MyMethod()
{          
   //You'll want to execute this twice, one for each xml file
   WebClient wc = new WebClient();
   wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
   wc.OpenReadAsync("{Enter url of XML File}");
}
private void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
   //Handle results here
   //Also you'll want to disable ProgressBar to show that the download is complete
   //Also you'll increment the counter that Chris suggested here
}

Как сказал Крис, все запросы асинхронны в Windows Phone 7, поэтому самый простой способ - создать переменную счетчика и увеличивать ее каждый раз, когда вызывается событие «OpenReadCompleted».,В то же время вы также отключите индикатор выполнения, чтобы показать, что загрузка завершена.Обработка ошибок, как вы сказали, также будет обрабатываться здесь, за исключением проверки сети.Возможно, вы захотите сделать это еще до того, как сделаете запрос.

Полный пример того, как читать XML-файлы (обычно rss или atom) из Интернета, можно найти в этом посте: Чтение элементов RSS вWindows Phone 7 .

ПРИМЕЧАНИЕ. Помните, что извлечение XML-файла из Интернета с помощью WebClient работает так же, как получение RSS-канала или атома.

...