如何在Windows Phone的工作线程中从UI线程获取值
本文关键字:线程 获取 UI 工作 Windows Phone | 更新日期: 2023-09-27 18:29:44
我想在我的windowsphone 8应用程序中使用POST方法调用RESTfull服务。因此,我需要在将请求解析为JSON后,将要发送的数据插入到请求的正文中。为此,我使用了以下代码:
enter cprivate void NextArrow_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
if (!String.IsNullOrEmpty(TxtBox_mail.Text))
{
Uri myUri = new Uri("http://myUri");
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(myUri);
myRequest.Method = "POST";
myRequest.ContentType = "application/json";
myRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), myRequest);
}
}
public void GetRequestStreamCallback(IAsyncResult callbackResult)
{
byte[] byteArray = null;
HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState;
// End the stream request operation
Stream postStream = myRequest.EndGetRequestStream(callbackResult);
// Create the post data
Dispatcher.BeginInvoke(() =>
{
string mailToCheck = TxtBox_mail.Text.ToString();
string postData = JsonConvert.SerializeObject(mailToCheck);
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);
}
我已经使用调度器来获取UI线程上的文本框控件的值,但byteArray总是null。有人知道这里可能出了什么问题?提前谢谢。
主要问题是使用异步BeginInvoke()
方法,该方法会立即返回。被调用的委托直到稍后才会执行,因此当当前线程继续尝试写入数据时,byteArray
变量仍然为null。
解决此问题的一种方法是使用Invoke()
方法。这种方法是同步的;也就是说,在被调用的代码完成之前,它不会返回。
IMHO,解决这个问题的更好方法是使用异步/等待模式。看起来像这样:
async void NextArrow_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
if (!String.IsNullOrEmpty(TxtBox_mail.Text))
{
Uri myUri = new Uri("http://myUri");
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(myUri);
myRequest.Method = "POST";
myRequest.ContentType = "application/json";
Stream postStream = await myRequest.GetRequestStreamAsync();
HttpWebResponse response = await GetRequestStreamCallback(postStream, myRequest);
// await GetResponsetStreamCallback(response) here...the
// method wasn't shown in the original question, so I've left
// out the particulars, as an exercise for the reader. :)
}
}
async void GetRequestStreamCallback(Stream postStream, WebRequest myRequest)
{
byte[] byteArray = null;
// Create the post data
string mailToCheck = TxtBox_mail.Text.ToString();
string postData = JsonConvert.SerializeObject(mailToCheck);
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
return await myRequest.GetResponseAsync();
}
正如您所看到的,通过这种方式可以以简单、直接和顺序的方式编写代码的主流,从而更容易看到执行流的位置,并简化逻辑的整体表达。