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

Shi*_*ada 5 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

key*_*rdP 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"));
        });
    }
Run Code Online (Sandbox Code Playgroud)