异步请求与MonoTouch

本文关键字:MonoTouch 请求 异步 | 更新日期: 2023-09-27 18:17:42

我试图在我的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.
  }
}

谢谢!

异步请求与MonoTouch

除非您有非常特定的需求,否则我强烈建议您使用WebClient而不是WebRequest。这将自动为您处理许多事情,并且(在大多数情况下)将更好地进行wrt内存管理。

。上面的大部分代码可以替换为DownloadStringAsync

否则你的代码看起来很好。事实上,我在一个MonoTouch应用程序内执行它,它运行没有问题(一旦GetUrl被替换),你的回调调用。

然而,你的注释,而不是你的代码,让我怀疑调用是否成功网络智能,但失败ui智能。例如

// Show temp value here.

异步回调将在另一个线程上调用。像大多数现有的UI工具包一样,UIKit要求所有与UI相关的操作都在主(UI)线程上完成。不这样做会给你带来很多痛苦。

你可以使用InvokeOnMainThread确保UI(或其他)代码在主线程上执行。