Выполнить несколько веб-запросов в WP7? - PullRequest
2 голосов
/ 15 июля 2011

У меня есть список адресов, которые я хочу посетить, используя httpWebRequest. Все, что мне нужно, это код состояния, возвращаемый сервером.

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

Мне довольно трудно понять, как это сделать без GetResponse, что запрещено в silverlight.

Код работает в фоновом режиме. И я использую Манго - WP7.1

Как мне это решить?

foreach (var current in Addresses)
        {
            var request = HttpWebRequest.Create(current);
            request.BeginGetResponse(r =>
            {
                try
                {
                    var response = (HttpWebResponse)request.EndGetResponse(r);
                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        //BOOM RECEIVED
                    });
                }
                catch (Exception)
                {
                    Debug.WriteLine("Error in EndGetResponse");
                }
            }, null);
        }

Заранее спасибо =)

1 Ответ

1 голос
/ 15 июля 2011

Ваша проблема с одним ответом, скорее всего, вызвана тем, что вы используете анонимные методы и то, как работает область видимости, когда вы помещаете их в циклы.Вы отбрасываете более ранние ссылки на запросы на каждом шаге цикла.

См. Мой пост на эту тему здесь http://csainty.blogspot.com/2010/10/windows-phone-7asynchronous-programming.html

Самый простой способ проиллюстрировать это - переписать ваш код с полнымметоды, это заставляет вас рассматривать область действия, а не просто слепо ссылаться на внешние переменные в ваших делегатах.

foreach (var current in Addresses)
{
  var request = HttpWebRequest.Create(current);
  request.BeginGetResponse(EndGetResponse, new RequestState { Request = request, Address = current });
}


private void EndGetResponse(IAsyncResult result) {
  try {
    var state = (RequestState)result.AsyncState;
    var response = (HttpWebResponse)state.Request.EndGetResponse(result);
    Deployment.Current.Dispatcher.BeginInvoke(GotResponse, state.Address, response.StatusCode);
  } catch (Exception) {
    Debug.WriteLine("Error in EndGetResponse");
  }
}

private void GotResponse(Address address, HttpStatusCode code) {
  //BOOM RECEIVED
}

public class RequestState {
  HttpWebRequest Request { get; set; }
  Address Address { get; set; }
}

Как только вы решите проблемы с областями видимости, вы можете переписать их обратно в анонимные методы по стилистическим причинам, если хотите.1009 *

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

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

...