Чтение NullReferenceException из асинхронного потока HttpWebRequest
Я программирую приложение для Windows Phone 7. Это приложение сначала отправляет, а затем получает данные с сервера через HttpWebRequest. В большинстве случаев это работает нормально, но иногда, после правильного получения части данных, я получаю исключение NullReferenceException в функции Stream.Read().
Связь начинается, когда пользователь нажимает кнопку. Затем я создаю запрос HttpWebRequest:
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(sUri);
request.Method = "POST";
request.BeginGetRequestStream(GetRequestStreamCallback, request);
Метод обратного вызова запроса:
private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
postStream = request.EndGetRequestStream(asynchronousResult);
this.bSyncOK = Send(); //This is my method to send data to the server
postStream.Close();
if (this.bSyncOK)
request.BeginGetResponse(GetResponseCallback, request);
else
manualEventWait.Set(); //This ManualResetEvent notify a thread the end of the communication, then a progressbar must be hidden
}
Метод ответного обратного вызова:
private void GetResponseCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult) )
{
using (streamResponse = new StreamReader(response.GetResponseStream() ) )
{
this.bSyncOK = Recv(); //This is my generic method to receive the data
streamResponse.Close();
}
response.Close();
}
manualEventWait.Set(); //This ManualResetEvent notify a thread the end of the communication, then a progressbar must be hidden
}
И, наконец, это код, в котором я получаю исключение при чтении данных потока:
int iBytesLeidos;
byte[] byteArrayUTF8 = new byte[8];
iBytesLeidos = streamResponse.BaseStream.Read(byteArrayUTF8, 0, 8); //NullReferenceException!!! -Server always send 8 bytes here-
Когда приложение запускается, я создаю фоновый поток, который часто отправляет информацию на сервер. Фоновая и ручная связь могут выполняться одновременно. Может ли это быть проблемой?
Благодарю.
3 ответа
Если streamResponse
является глобальной переменной, это может вызвать проблему в случае доступа из другого потока. Передай свой Stream
к Recv
в качестве параметра
using (StreamReader streamResponse = new StreamReader(response.GetResponseStream() ) )
{
this.bSyncOK = Recv(streamResponse); //This is my generic method to receive the data
streamResponse.Close();
}
Где твое streamResponse
объявлено в последнем фрагменте? Это тот же объект, что и в 3d фрагменте? Может быть, вы просто используете другую переменную вместо фактического потока.
Во втором фрагменте попытайтесь удалить "postStream.Close();".