Подождите, пока ответ не будет получен полностью - PullRequest
1 голос
/ 11 сентября 2010

У меня есть приложение для Windows Phone 7 (на основе Silverlight), которое отправляет веб-запрос и получает веб-ответ. Это работает нормально - я использую BeginGetReponse и AsyncCallback для вызова EndGetResponse .

Однако мне нужно дождаться полного ответа, чтобы я мог заполнить коллекцию данными из ответа.

Как лучше всего дождаться завершения операции?

Ответы [ 2 ]

3 голосов
/ 11 сентября 2010

Вы должны заполнить свои данные в обратном вызове после вызова EndGetResponse:

request.BeginGetResponse(
      asyncResult =>
      {
         var response = request.EndGetResponse(asyncResult);
         // fill in your data here
      },
      null);

Если вам нужно заполнить ваши данные в потоке пользовательского интерфейса, вы можете вернуться к потоку пользовательского интерфейса следующим образом:

var sc = System.Threading.SynchronizationContext.Current;
request.BeginGetResponse(
      asyncResult =>
      {
         var response = request.EndGetResponse(asyncResult);
         sc.Post(o => 
            {
               // fill in your data here
            }, null);
      },
      null);

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.endgetresponse.aspx имеет более сложный образец.

2 голосов
/ 11 сентября 2010

Вы можете установить для свойства AllowReadStreamBuffering объекта HttpWebRequest значение true, и в этом случае обратный вызов BeginGetResponse будет вызываться, как только будет доступен весь ответ.

Обратите внимание, что запрос обрабатывается в фоновом режиме во всех случаях, независимо от значения AllowReadStreamBuffering. Это означает, что request.BeginGetResponse (...) всегда будет возвращаться немедленно, и что его обратный вызов будет позже вызываться в другом потоке. По предложению Мити, вы можете использовать SynchronizationContext (или Deployment.Current.Dispatcher ) для обновления вашего пользовательского интерфейса.

...