使用MonoTouch进行异步请求

4

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

谢谢!


你为什么认为它不会返回?你能在回调函数中设置断点吗?它们被调用了吗? - poupou
1个回答

1

除非您有非常特定的要求,否则我强烈建议使用{{link1:WebClient}}而不是WebRequest。这将为您处理许多事情,并且在大多数情况下(就内存管理而言)会更好。

例如,您上面的大部分代码都可以替换为{{link2:DownloadStringAsync}}

否则,您的代码看起来很好。实际上,我在MonoTouch应用程序中执行它时没有问题(一旦替换了GetUrl),并且您的回调已经被调用。

但是,您的评论而不是代码让我想知道调用是否在网络方面成功但在界面方面失败,例如:

// Show temp value here.

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

您可以通过使用InvokeOnMainThread确保UI(或其他)代码在主(UI)线程上执行。有关更多详细信息,请参见文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接