2011-12-13 20 views
5

Próbuję odczytać bajty z obiektu ResponeStream, ale jak mogę powiedzieć, aby poczekać na dane?WebRequest GetResponseStream odczytuje bajty

Jeśli ustawię punkt przerwania po GetResponseStream i poczekaj kilka sekund, wszystko działa poprawnie. Używanie StreamReader.ReadToEnd() również działa dobrze, ale chcę sam odczytać bajty.

byte[] response = null; 

int left = 0; 
int steps = 0; 
int pos = 0; 

int bytelength = 1024; 

OnReceiveStart(); 

using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse()) { 
    using (Stream sr = webResponse.GetResponseStream()) { 

     response = new byte[(int)webResponse.ContentLength]; 

     left = (int)webResponse.ContentLength % bytelength; 
     steps = (int)webResponse.ContentLength/bytelength; 
     pos = 0; 

     for (int i = 0; i < steps; i++) { 
      sr.Read(response, pos, bytelength); 
      pos += bytelength; 
      OnReceiveProgress((int)webResponse.ContentLength, pos); 
     } 

     if (left != 0) { 
      sr.Read(response, pos, left); 
     } 

     sr.Close(); 
    } 
    webResponse.Close(); 
} 

OnReceiveProgress(1, 1); 

OnReceiveFinished(); 
+0

Jaki jest dokładny problem, który masz? BTW, 'Read' zwraca liczbę faktycznie odczytanych bajtów. Użyj tego zamiast 'bytelength' jako liczby przeczytanych bajtów. –

Odpowiedz

6

prostu nie złamać go w równej liczbie kroków - zamiast, po prostu zachować czytania w pętli aż skończysz:

while (pos < response.Length) 
{ 
    int bytesRead = sr.Read(response, pos, response.Length - pos); 
    if (bytesRead == 0) 
    { 
     // End of data and we didn't finish reading. Oops. 
     throw new IOException("Premature end of data"); 
    } 
    pos += bytesRead; 
    OnReceiveProgress(response.Length, pos); 
} 

pamiętać, że musi korzystania powrót wartość Stream.Read - nie możesz założyć będzie czytać wszystko, o co prosiłeś.