2011-12-11 180 views
4

我想在我的MonoTouch应用程序中执行异步请求。当我执行下面的代码时,它的行为就像请求开始,但它似乎永远不会返回。我究竟做错了什么?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. 
    } 
} 

谢谢!

+0

是什么让你觉得它不*返回*?你能在你的回调中加入断点吗?他们叫? – poupou

回答

1

除非你有非常具体我的要求强烈建议您通过WebRequest使用WebClient。这会为你自动处理很多东西,并且对于内存管理来说会更好(在大多数情况下)。

E.g.以上大部分代码都可以替换为DownloadStringAsync

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

但是您的意见,而不是你的代码,使我不知道,如果呼叫成功网络的明智但失败UI明智。例如

// Show temp value here. 

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

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