Windows 8 Phone正在等待BeginGetRequestStream完成

本文关键字:BeginGetRequestStream 完成 在等待 Phone Windows | 更新日期: 2023-09-27 18:01:07

我有下面的代码,我用它来连接REST

    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());

        }
    }

问题是,当从Phone UI调用aqureToken方法时,它没有等待httprequest完成,这会导致nullreferences,因为下一个UI页面正在尝试访问尚未加载的数据。。

如何在UI线程上呈现一个简单的加载器,同时从API获取所需的信息?

提前谢谢。

Windows 8 Phone正在等待BeginGetRequestStream完成

您必须等待代码完成。一种方法是将另一个参数传递给acquireToken,该参数将在操作完成时调用。

这样,调用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();
    }
}