2012-10-20 61 views
1

在下面的代碼中可能會導致內存不足異常?我的程序運行了幾個小時,然後死亡。該代碼每次只發送/接收非常少量的數據,因此沒有大文件或字符串通過網絡傳回或返回。代碼每隔3秒左右從服務器發送和接收。OutOfMemoryException讀取響應流

private void Read() 
{ 
    string postData = "Name=John" 
    using (HttpWebResponse response = SendRequest(new Uri(@"someWebSitehere"), postData)) 
    { 
     Stream stream = response.GetResponseStream(); 
     StreamReader reader = new StreamReader(stream); 
     responseFromServer = reader.ReadToEnd();  IT THROWS OUT OF MEMORY HERE 
      stream.Close(); 
    } 
} 

private HttpWebResponse SendRequest(Uri uri, string postData) 
{ 
    lock (SendRequestLock) 
    { 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri); 

     req.Method = "POST"; 
     req.CookieContainer = new CookieContainer(); 
     req.Proxy = null; 
     UTF8Encoding encoding = new UTF8Encoding(); 
     byte[] byte1 = encoding.GetBytes(postData); 

     // Set the content type of the data being posted. 
     req.ContentType = "application/x-www-form-urlencoded"; 

     // Set the content length of the string being posted. 
     req.ContentLength = byte1.Length; 

     req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)"; 
     req.Method = "POST"; 
     req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 
     req.Headers.Add("Accept-Language: en-us,en;q=0.5"); 
     req.Headers.Add("Accept-Encoding: gzip,deflate"); 
     req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 
     req.KeepAlive = true; 
     req.Headers.Add("Keep-Alive: 300"); 
     using (Stream stream = req.GetRequestStream()) 
     { 
      stream.Write(byte1, 0, byte1.Length); 
     } 
     return (HttpWebResponse)req.GetResponse(); 
    } 
} 
+0

什麼部分觸發OOM異常? – Joe

回答

2

你要配置了IDisposable類StreamStreamReader的:實現IDisposable一般他們會掛到,除非你打電話Dispose()(或者,同樣的事情外部資源

using (Stream stream = response.GetResponseStream()) 
{ 
    using (StreamReader reader = new StreamReader(stream)) 
    { 
     responseFromServer = reader.ReadToEnd();  //IT THROWS OUT OF MEMORY HERE 
    } 
} 

類,把它放在using區塊內)。每次運行代碼塊時,這些類可能會泄漏內存,因此在一段時間後出現「內存不足」異常。

值得閱讀MSDN's notes on IDisposable

+0

這最終成爲解決方案。 –

1

您是否檢查過響應的Content-Length。也許它是非常巨大的。在這種情況下,您應該閱讀響應流部分

+0

我還沒有確切地檢查過它。什麼被認爲是一個好的尺寸,開始閱讀一部分? –

+0

這取決於你如何處理服務器響應。 – zabulus

+0

我得到文本並解析它。 –