如何在主线程中获得异步结果

时间:2011-07-03 15:57:49

标签: windows-phone-7

我正在Windows Phone 7应用上创建一个登录页面。当在异步线程上从服务器返回登录错误消息时,我想在登录页面上获取登录错误状态代码。

所以我的问题是: 在下面的代码示例中,请告诉我如何在Main方法中获得“responseString(string)”?

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.begingetrequeststream.aspx

using System;
using System.Net;
using System.IO;
using System.Text;
using System.Threading;

class HttpWebRequestBeginGetRequest
{
    private static ManualResetEvent allDone = new ManualResetEvent(false);

    public static void Main(string[] args)
    {


        // Create a new HttpWebRequest object.
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.contoso.com/example.aspx");

        request.ContentType = "application/x-www-form-urlencoded";

        // Set the Method property to 'POST' to post data to the URI.
        request.Method = "POST";

        // start the asynchronous operation
        request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);

        // Keep the main thread from continuing while the asynchronous
        // operation completes. A real world application
        // could do something useful such as updating its user interface. 
        allDone.WaitOne();

        /* I'd like to get "responseString" here. */
    }

    private static void GetRequestStreamCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

        // End the operation
        Stream postStream = request.EndGetRequestStream(asynchronousResult);

        Console.WriteLine("Please enter the input data to be posted:");
        string postData = Console.ReadLine();

        // Convert the string into a byte array.
        byte[] byteArray = Encoding.UTF8.GetBytes(postData);

        // Write to the request stream.
        postStream.Write(byteArray, 0, postData.Length);
        postStream.Close();

        // Start the asynchronous operation to get the response
        request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
    }

    private static void GetResponseCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

        // End the operation
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
        Stream streamResponse = response.GetResponseStream();
        StreamReader streamRead = new StreamReader(streamResponse);
        string responseString = streamRead.ReadToEnd(); /* I'd like to get this responseString in Main method. */
        Console.WriteLine(responseString);
        // Close the stream object
        streamResponse.Close();
        streamRead.Close();

        // Release the HttpWebResponse
        response.Close();
        allDone.Set();
    }
}

1 个答案:

答案 0 :(得分:3)

您可以将responseString定义为类级变量,而不是在GetResponseCallback方法中定义它。这样,它可以从类中的任何地方访问,而不仅仅是方法范围。

要从后台线程导航到另一个页面,您可以使用Dispatcher

    //Method to move to next page. Can be called from GetResponseCallBack
    private void NavigateToNextPage()
    {
        Dispatcher.BeginInvoke(() =>
        {
           NavigationService.Navigate(new Uri("Page2.xaml", UriKind.Relative"));
        });
    }