Как заставить мою функцию ждать завершения асинхронной функции? - PullRequest
1 голос
/ 22 апреля 2011

Мне нужен код, который позволит мне узнать, когда завершился асинхронный поток.Это для моего приложения для Windows Phone, которое я делаю.Приложение представляет собой систему отслеживания автобусов, которая показывает прямые рейсы, и данные будут взяты с веб-страницы в Интернете.

У меня есть эта строка кода в моей функции GetDataFeed

 // start the asynchronous request
IAsyncResult aResult =   BusStopFeedRequest.BeginGetResponse(new AsyncCallback(HandleFeedData), myState);

Это вызоветотключил мою HandleFeedData функцию, которая сохранит исходный код веб-сайта в переменную текстовой строки.

Моя проблема заключается в том, что текстовое поле в моем телефонном приложении не заполняет содержимое строки, поскольку пока нет данных в строке,Это вызывается textbox1.Text = obj.GetText(), который должен возвращать приватную строку в моем экземпляре класса.

Я рассмотрел использование aResult.AsyncWaitHandle.WaitOne() и попытался опросить методы aResult.IsCompleted(), но из того, что я прочитал и нашелЯ просто не работаю.WaitOne выдает неожиданную ошибку, и опрос IsCompleted находится в бесконечном цикле.

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

Ответы [ 2 ]

0 голосов
/ 08 августа 2012

В Windows Phone HTTPWebRequest содержит методы BeginGetResponse и EndGetResponse. Вам необходимо добавить аналогичный код в функцию HanldeFeedData.

HttpWebResponse response=(result.AsyncState as HttpWebrequest).EndGetResponse(result) as HttpWebResponse;
 string returnValue=null;
  using (StreamReader sr=new StreamReader(response.GetResponseStrem())
  {
      returnValue=sr.ReadToEnd();
   } 

   Dispatcher.BeginInvoke(new Action(()=>textbox1.Text=returnValue));
0 голосов
/ 25 мая 2011

Вы уверены, что строка действительно загружается?«BeginGetResponse» - это функция класса WebRequest, которая недоступна на Windows Phone.Возможно, данные не загружаются.Однако, если он загружается, я предлагаю вам сделать что-то вроде этого:

IAsyncResult aResult = BusStopFeedRequest.BeginGetResponse(new AsyncCallback(HandleFeedData));

, а затем:

private void HandleFeedData(IAsyncResult result)
{
    string feedData = (string)result.AsyncState;
    textbox1.Text = feedData;
    // code to save the feedData here
}

Однако было бы полезно точно знать, когда BusStopFeedRequest's BeginGetResponse"уволен.

...