2011-12-13 8 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

आपके पास क्या समस्या है? बीटीडब्ल्यू, 'रीड' वास्तव में पढ़ा गया बाइट्स की संख्या देता है। बाइट्स पढ़ने की संख्या के रूप में '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 का मान - आप मान सकते हैं कि यह आपके द्वारा मांगी गई सभी चीजें पढ़ेगा।

संबंधित मुद्दे