Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows 8 Phone正在等待BeginGetRequestStream完成_C#_Multithreading_Windows Phone 8_Httpwebrequest - Fatal编程技术网

C# Windows 8 Phone正在等待BeginGetRequestStream完成

C# Windows 8 Phone正在等待BeginGetRequestStream完成,c#,multithreading,windows-phone-8,httpwebrequest,C#,Multithreading,Windows Phone 8,Httpwebrequest,我有下面的代码,我用它来连接一个REST public void aquireToken() { HttpWebRequest apiR = (HttpWebRequest)HttpWebRequest.Create(new Uri(apiUrl + "authorize?")); apiR.Method = "POST"; apiR.ContentType = "application/x-www-form-urlencod

我有下面的代码,我用它来连接一个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());


        }
    }
public void aquireToken()
{
HttpWebRequest apiR=(HttpWebRequest)HttpWebRequest.Create(新Uri(APIRL+“授权?”);
apiR.Method=“POST”;
apiR.ContentType=“应用程序/x-www-form-urlencoded”;
BeginGetRequestStream(新的AsyncCallback(GetRequestStreamCallback),apiR);
}
私有void GetRequestStreamCallback(IAsyncResult callbackResult)
{
HttpWebRequest myRequest=(HttpWebRequest)callbackResult.AsyncState;
//结束流请求操作
Stream postStream=myRequest.EndGetRequestStream(callbackResult);
//创建post数据
string postData=“username=“+NTUser.username+”&appId=“+appId+”&signed=“+CreateSignedHex()”;
byte[]byteArray=Encoding.UTF8.GetBytes(postData);
//将post数据添加到web请求
Write(byteArray,0,byteArray.Length);
postStream.Close();
//启动web请求
BeginGetResponse(新的AsyncCallback(GetResponsetStreamCallback),myRequest);
}
私有void GetResponsetStreamCallback(IAsyncResult callbackResult)
{
HttpWebRequest请求=(HttpWebRequest)callbackResult.AsyncState;
HttpWebResponse=(HttpWebResponse)request.EndGetResponse(callbackResult);
使用(StreamReader httpWebStreamReader=newstreamreader(response.GetResponseStream())
{
字符串结果=httpWebStreamReader.ReadToEnd();
var u=JsonConvert.DeserializeObject(结果);
//字符串jsondata=u.data.toString();
NTUser.token=JsonConvert.DeserializeObject(u.data.ToString());
}
}
问题是,当从电话UI调用aquireToken方法时,它不会等待httprequest完成,这会导致出现空引用,因为下一个UI页面正在尝试访问尚未加载的数据

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


提前感谢。

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

这样,调用Acquisitor Oken方法的UI只知道在调用callbabl时使用数据

在页面上显示“加载UI”的一种方法是放置一个背景为黑色或白色、半透明且可见性设置为折叠的“网格”元素。在该网格中放置一个进度条。加载时,将所述网格的可见性更改为可见,从而阻塞UI并让您的sea知道您正在做什么

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

    }
}
public void DoUIThings()
{
//做一些与用户界面相关的事情。
acquireToken();
//不要继续在此处执行操作…等待调用ContinueDoUIThings()。
}
公共无效继续UIThings()
{
//现在在这里使用您新创建的令牌。。。
//做一些与用户界面相关的事情。
//请注意,这是从下面调用的。
}
公开声明
{
//..您的代码在这里。。
BeginGetRequestStream(新的AsyncCallback(GetRequestStreamCallback),apiR);
}
私有void GetRequestStreamCallback(IAsyncResult callbackResult)
{
///你的代码在这里。。。。。
BeginGetResponse(新的AsyncCallback(GetResponsetStreamCallback),myRequest);
}
私有void GetResponsetStreamCallback(IAsyncResult callbackResult)
{
HttpWebRequest请求=(HttpWebRequest)callbackResult.AsyncState;
HttpWebResponse=(HttpWebResponse)request.EndGetResponse(callbackResult);
使用(StreamReader httpWebStreamReader=newstreamreader(response.GetResponseStream())
{
字符串结果=httpWebStreamReader.ReadToEnd();
var u=JsonConvert.DeserializeObject(结果);
//字符串jsondata=u.data.toString();
NTUser.token=JsonConvert.DeserializeObject(u.data.ToString());
//在这里添加此呼叫。。。
继续思考();
}
}

我不知道如何理解您的任何答案。。你能给出一个用法的例子吗?你需要使用回调函数(GetResponsetStreamCallback)来发出UI调用的延续。在答案中添加伪示例。