Чтение 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-

Когда приложение запускается, я создаю фоновый поток, который часто отправляет информацию на сервер. Фоновая и ручная связь могут работать одновременно. Может ли это быть проблемой?

Спасибо.


person Federico Quirós    schedule 29.12.2011    source источник


Ответы (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();
}
person Ku6opr    schedule 29.12.2011

Где ваш streamResponse объявлен в последнем фрагменте? Это тот же объект, что и в 3D-фрагменте? Возможно, вы просто используете другую переменную вместо фактического потока.

person the_joric    schedule 29.12.2011
comment
Да, весь код принадлежит одному классу. Это объявление streamResponse --› private static StreamReader streamResponse; - person Federico Quirós; 29.12.2011
comment
не могли бы вы проверить, является ли streamResponse или .BaseStream нулевым? - person the_joric; 29.12.2011
comment
Ну, я попробовал ваш код на рабочем столе - он работает. Не могли бы вы просмотреть мою версию bit.ly/utT5k3 и убедиться, что ваша выглядит так же? Также может быть состояние гонки - я не заметил, где вы сбрасываете свое событие. Я добавил параллельную версию в свое решение. - person the_joric; 30.12.2011

во втором фрагменте попробуйте удалить "postStream.Close();".

person Hua.Cai    schedule 30.12.2011