2011-12-13 91 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 - 您不能假设它会读取您要求的所有内容。