如何在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。有人知道这里可能出了什么问题?提前谢谢。

如何在Windows Phone的工作线程中从UI线程获取值

主要问题是使用异步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();
}

正如您所看到的,通过这种方式可以以简单、直接和顺序的方式编写代码的主流,从而更容易看到执行流的位置,并简化逻辑的整体表达。