C# Windows 8 Phone正在等待BeginGetRequestStream完成
我有下面的代码,我用它来连接一个RESTC# 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
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调用的延续。在答案中添加伪示例。