2014-04-30 44 views
0

我有以下代碼用來連接一個RESTWindows 8的電話等待BeginGetRequestStream完成

public void aquireToken() 
    { 
     HttpWebRequest apiR = (HttpWebRequest)HttpWebRequest.Create(new Uri(apiUrl + "authorize?")); 
     apiR.Method = "POST"; 

     apiR.ContentType = "application/x-www-form-urlencoded"; 

     apiR.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), apiR); 
    } 



    private void GetRequestStreamCallback(IAsyncResult callbackResult) 
    { 
     HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState; 
     // End the stream request operation 
     Stream postStream = myRequest.EndGetRequestStream(callbackResult); 

     // Create the post data 
     string postData = "username=" + NTUser.username + "&appId=" + appId + "&signed=" + CreateSignedHex(); 


     byte[] byteArray = Encoding.UTF8.GetBytes(postData); 

     // Add the post data to the web request 
     postStream.Write(byteArray, 0, byteArray.Length); 
     postStream.Close(); 

     // Start the web request 
     myRequest.BeginGetResponse(new AsyncCallback(GetResponsetStreamCallback), myRequest); 
    } 

    private void GetResponsetStreamCallback(IAsyncResult callbackResult) 
    { 
     HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState; 
     HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult); 
     using (StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream())) 
     { 
      string result = httpWebStreamReader.ReadToEnd(); 
      var u = JsonConvert.DeserializeObject<dynamic>(result); 

      //string jsondata = u.data.toString(); 


      NTUser.token = JsonConvert.DeserializeObject<Token>(u.data.ToString()); 


     } 
    } 

問題呼籲從手機UI的aquireToken方法時,它不會在等待其即時通訊httprequest完成,這將導致nullreferences,因爲下一個UI頁面試圖訪問尚未加載的數據..

如何在從API獲取所需信息的同時在UI線程上呈現簡單的加載程序?

在此先感謝。

回答

0

你必須等待代碼來完成。這樣做的一個方法是通過另一個參數來獲取令牌,當操作完成後將調用它。

這樣一來,調用acquireRoken方法的UI知道使用只有當callbabl被稱爲數據。呈現出「加載UI」頁面上的

一種方法是將與黑色背景或白色「網格」元素是半透明的,有其可見性設置爲摺疊。在該網格中放置一個進度條。在裝載時說,網格的可見性更改爲可見,從而阻塞UI,讓你的海水,你正在做的事情。

public void DoUIThings() 
{ 
    // Do some UI related things. 
    acquireToken(); 
    // Don't continue doing things here.... Wait for the ContinueDoUIThings() to be called. 
} 

public void ContinueDoUIThings() 
{ 
     // Now use your newly created token here... 
     // Do some UI related things. 
     // Note that this is called from below. 
} 

public void aquireToken() 
{ 
    // .... Your code was here.. 
    apiR.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), apiR); 
} 

private void GetRequestStreamCallback(IAsyncResult callbackResult) 
{ 
    /// Your code was here..... 
    myRequest.BeginGetResponse(new AsyncCallback(GetResponsetStreamCallback), myRequest); 
} 

private void GetResponsetStreamCallback(IAsyncResult callbackResult) 
{ 
    HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState; 
    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult); 
    using (StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream())) 
    { 
     string result = httpWebStreamReader.ReadToEnd(); 
     var u = JsonConvert.DeserializeObject<dynamic>(result); 

     //string jsondata = u.data.toString(); 
     NTUser.token = JsonConvert.DeserializeObject<Token>(u.data.ToString()); 

     // Added this call here... 
     ContinueDoUIThings(); 

    } 
} 
+0

我不知道如何按照你的任何答案..你能給一個用法的例子嗎? – Peter

+0

您需要使用回調(GetResponsetStreamCallback)發出呼叫的用戶界面的延續。在答案中添加僞示例。 –