Как я могу дождаться ответа и выполнить операции с ним? - PullRequest
0 голосов
/ 29 июня 2011

У меня есть одна новая проблема.Я хочу выполнить некоторые операции с ответом, но я получаю исключение NullReferenceException, потому что оно еще не пришло ... Вот мой код:

public partial class MainPage : PhoneApplicationPage
{
    public static string res = null;

    // Constructor
    public MainPage()
    {
        InitializeComponent();
        string Url = "http://twitter.com";
        WebRequest req = WebRequest.Create(Url);
        req.BeginGetResponse(new AsyncCallback(request_CallBack), req);
        int i = MainPage.res.Length; // NullReferenceException
    }

    void request_CallBack(IAsyncResult result)
    {
        WebRequest webRequest = result.AsyncState as WebRequest;
        WebResponse response = (WebResponse)webRequest.EndGetResponse(result);
        Stream baseStream = response.GetResponseStream();
        using (StreamReader reader = new StreamReader(baseStream))
        {
            res = reader.ReadToEnd();
            Dispatcher.BeginInvoke(() => { MessageBox.Show("The response is arrived."); });
            Dispatcher.BeginInvoke(() => { tbResponse.Text = res; });
        }
    }
}

Но когда я использую класс ManualResetEvent, мое приложениепросто зависает из-за строки if (dataReady.WaitOne ()).Вот полный код с классом ManualResetEvent:

public partial class MainPage : PhoneApplicationPage
{
    public static string res = null;
    ManualResetEvent dataReady;

    // Constructor
    public MainPage()
    {
        InitializeComponent();
        string Url = "http://twitter.com";
        dataReady = new ManualResetEvent(false);
        WebRequest req = WebRequest.Create(Url);
        req.BeginGetResponse(new AsyncCallback(request_CallBack), req);
        if (dataReady.WaitOne())
        {
            int i = MainPage.res.Length;
        }
    }

    void request_CallBack(IAsyncResult result)
    {
        WebRequest webRequest = result.AsyncState as WebRequest;
        WebResponse response = (WebResponse)webRequest.EndGetResponse(result);
        Stream baseStream = response.GetResponseStream();
        using (StreamReader reader = new StreamReader(baseStream))
        {
            res = reader.ReadToEnd();
            Dispatcher.BeginInvoke(() => { MessageBox.Show("The response is arrived."); });
            Dispatcher.BeginInvoke(() => { tbResponse.Text = res; });
        }
        dataReady.Set();
    }
}

Итак, у меня вопрос: Как мне дождаться ответа и выполнить операции с ним? (я пытался использоватьМетод Application.DoEvent, но его нет в WP7 ...)

Ответы [ 3 ]

1 голос
/ 29 июня 2011

вы не можете поставить этот код

int i = MainPage.res.Length; // NullReferenceException

на request_CallBack функцию?

как

void request_CallBack(IAsyncResult result)
    {
        WebRequest webRequest = result.AsyncState as WebRequest;
        WebResponse response = (WebResponse)webRequest.EndGetResponse(result);
        Stream baseStream = response.GetResponseStream();
        using (StreamReader reader = new StreamReader(baseStream))
        {
            res = reader.ReadToEnd();
            Dispatcher.BeginInvoke(() => { MessageBox.Show("The response is arrived."); });
            Dispatcher.BeginInvoke(() => { tbResponse.Text = res; });
        }
    int i = res.Length; //here
    }
0 голосов
/ 01 июля 2011
public partial class MainPage : PhoneApplicationPage

{ открытая статическая строка res = null;

// Constructor
public MainPage()
{
    InitializeComponent();
    string Url = "http://twitter.com";
    WebRequest req = WebRequest.Create(Url);
    req.BeginGetResponse(new AsyncCallback(request_CallBack), req);

}

void request_CallBack(IAsyncResult result)
{
    WebRequest webRequest = result.AsyncState as WebRequest;
    WebResponse response = (WebResponse)webRequest.EndGetResponse(result);
    Stream baseStream = response.GetResponseStream();
    using (StreamReader reader = new StreamReader(baseStream))
    {
        res = reader.ReadToEnd();
        Dispatcher.BeginInvoke(() => { MessageBox.Show("The response is arrived."); });
        Dispatcher.BeginInvoke(() => { tbResponse.Text = res; });
    }
    int i = MainPage.res.Length; //No  NullReferenceException
}

}

0 голосов
/ 29 июня 2011

В настоящее время вы используете один из асинхронных методов WebRequest.Если вы хотите дождаться ответа, вы можете просто использовать эквивалентный синхронный метод GetResponse.

http://msdn.microsoft.com/en-us/library/system.net.webrequest.getresponse.aspx

...