Асинхронные запросы с MonoTouch - PullRequest
4 голосов
/ 11 декабря 2011

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

private void StartAsyncRequest()
{
  try
  {
    // Asynchronously execute the query using HttpWebRequest
    string url = GetUrl();
    WebRequest request = WebRequest.Create(url);
    request.BeginGetResponse(new AsyncCallback(AsyncAttempt_Completed), request);
  }
  catch (Exception ex)
  {
    // Show error message here.
  }
}

private void AsyncAttempt_Completed(IAsyncResult result)
{
  try
  {
    // 1. Get the response from the service call
    WebRequest request = (WebRequest)(result.AsyncState);
    using (WebResponse response = request.EndGetResponse(result))
    {
      using (StreamReader reader = new StreamReader(response.GetResponseStream()))
      {
        string temp = reader.ReadToEnd();
        // Show temp value here.
      }
    }
  }
  catch (Exception ex)
  {
    // Show error message here.
  }
}

Спасибо!

1 Ответ

1 голос
/ 11 декабря 2011

Если у вас нет очень особых требований, я настоятельно предлагаю вам использовать WebClient сверх WebRequest. Это будет обрабатывать многое для вас автоматически и будет лучше (в большинстве случаев) по сравнению с управлением памятью.

например. большая часть вашего кода выше может быть заменена на DownloadStringAsync

В противном случае ваш код выглядит нормально. На самом деле я выполнил его в приложении MonoTouch, и он работает без проблем (после замены GetUrl), и ваш обратный вызов называется .

Однако ваши комментарии, а не код заставляют меня задуматься, если вызов успешен по сети , но не удается по интерфейсу . например,

// Show temp value here.

Асинхронный обратный вызов будет вызываться в другом потоке. UIKit, как и большинство существующих инструментов UI, требует, чтобы все связанные с UI операции выполнялись в основном потоке (UI). Отказ от этого принесет вам много боли.

Вы можете убедиться, что код UI (или другой) выполняется в основном потоке (UI), используя InvokeOnMainThread. См. статью для более подробной информации.

...