2011-12-13 78 views
5

我想從ResponeStream讀取字節,但我怎麼能說等待數據?WebRequest GetResponseStream讀取字節

如果我在GetResponseStream後設置一個斷點,並等待幾秒鐘,所有工作正常。 使用StreamReader.ReadToEnd()也可以正常工作,但我想自己讀取字節。

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

你有什麼確切的問題?順便說一下,'Read'返回實際讀取的字節數。使用它來代替'bytelength'作爲讀取的字節數。 –

回答

6

只是不打破它到你的同等數量的措施 - 而不是,只是不停地在閱讀一個循環,直到你完成:

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

請注意,您必須使用返回值Stream.Read - 您不能假設它會讀取您要求的所有內容。