2011-12-11 178 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