2011-12-13 12 views
5

Bir ResponeStream'den bayt okumaya çalışıyorum ama verileri beklemeyi nasıl söyleyebilirim?WebRequest GetResponseStream okuma baytları

GetResponseStream'den sonra bir kesme noktası belirler ve birkaç saniye beklerse, her şey iyi çalışır. StreamReader.ReadToEnd() kullanımı da iyi çalışıyor, ancak baytları kendim okumak istiyorum.

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

Tam olarak sorun nedir? BTW, 'Read' aslında okunan bayt sayısını döndürür. Okunan bayt sayısı olarak "bytelength" yerine bunu kullanın. –

cevap

6

Sadece adımların sizin eşit sayıda duruma bozmazlar - bunun yerine, sadece bitirdiniz kadar bir döngü içinde okumaya devam: Eğer getiriyi kullanması gerekir

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); 
} 

Not Stream.Read'un değeri - 'u kabul edemezsiniz, istediğiniz her şeyi okuyacaktır.

İlgili konular