Как я могу дождаться ответа и выполнить операции с ним?
У меня есть одна новая проблема. Я хочу выполнить некоторые операции с ответом, но я получаю исключение 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 ответа
Ты не можешь поставить этот код
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
}
В настоящее время вы используете один из асинхронных методов WebRequest
, Если вы хотите дождаться ответа, вы можете просто использовать эквивалентный синхронный метод GetResponse
,
http://msdn.microsoft.com/en-us/library/system.net.webrequest.getresponse.aspx
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
}
}