2014-04-30 3 views
0

У меня есть следующий код, который им, используя для подключения ОтдыхаетWindows 8 Phone ждать 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()); 


     } 
    } 

Проблемы при вызове метода aquireToken из телефонного интерфейса, он не ждать на httprequest для завершения, которые вызывают в null-ссылках, потому что следующая страница пользовательского интерфейса пытается получить доступ к данным, которые еще не загружены.

Как представить простой загрузчик в потоке пользовательского интерфейса при получении необходимой информации из API ?

Заранее спасибо.

ответ

0

Вы должны дождаться завершения кода. Один из способов сделать это - передать другой аргумент purchaseToken, который вызывается при выполнении операции.

Таким образом, пользовательский интерфейс, вызывающий метод purchaseRoken, знает, что использовать данные только при вызове callbabl.

Один из способов отображения «загрузочного интерфейса» на вашей странице состоит в том, чтобы поместить элемент «Сетка» с фоном черного или белого, который является полупрозрачным и имеет видимость для сворачивания. Поместите индикатор выполнения в эту сетку. Во время загрузки измените видимость указанной сетки на Visible, тем самым блокируя пользовательский интерфейс и позволяя своему морю что-то делать.

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) для продолжения вызова пользовательского интерфейса. Добавление псевдопоказа в ответе. –