2012-10-20 58 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

我得到文本并解析它。 –