Переполнение стека - C# (190561)
Формулировка задачи:
Проблема в следующем, есть программа, которая должна многопоточно перебирать списки сайтов, запросы реализованы следующим образом:
В потоках просто происходит вызов этой функции и обработка полученного содержимого. Вот несколько скриншотов с утилиты dotMemory:
Как видно, переполняется область Heap Generation 2, а, в частности, типами данных Char[] и StringBuilder. Проблема в том, что у меня нет типа данных StringBuilder или Char[] в коде, я использую String и List() . Подозреваю на код внутри класса HttpWebRequest, не знаю просто на что уже другое думать. Просто происходит рост занятой оперативной памяти до зависания приложения. Буду благодарен за помощь!
static string Get(string adr) { string content = ""; HttpWebResponse response=null; Stream stream=null; StreamReader reader=null; try { HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://"+adr); //WebProxy prx = new WebProxy("127.0.0.1", 8888); req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0"; req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; req.Proxy = null; req.KeepAlive = false; req.Headers.Add("Accept-Language", "ru-RU,ru;q=0.9,en;q=0.8"); req.AllowAutoRedirect = true; req.Timeout = 10000; req.ReadWriteTimeout = 10000; req.MaximumAutomaticRedirections = 1; req.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; req.Method = WebRequestMethods.Http.Get; using (response = (HttpWebResponse)req.GetResponse()) using (stream = response.GetResponseStream()) using (reader = new StreamReader(stream, Encoding.Default)) { content = System.Net.WebUtility.HtmlDecode(reader.ReadToEnd()); response.Close(); stream.Close(); reader.Close(); } } catch { response.Close(); stream.Close(); reader.Close(); } return content; }
Решение задачи: «Переполнение стека»
textual
Листинг программы
static string Get(string adr, int maxResponseSize = 1024*1024) { HttpWebRequest req = (HttpWebRequest)WebRequest.Create(adr); req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0"; req.Proxy = null; req.KeepAlive = false; req.Headers.Add("Accept-Language", "ru-RU,ru;q=0.9,en;q=0.8"); req.AllowAutoRedirect = true; req.Timeout = 10000; req.ReadWriteTimeout = 10000; req.MaximumAutomaticRedirections = 10; req.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; req.Method = WebRequestMethods.Http.Get; using (var response = (HttpWebResponse) req.GetResponse()) { using (var stream = response.GetResponseStream()) { if (stream == null) throw new NullReferenceException("Response stream is nulL!"); byte[] buffer = new byte[maxResponseSize]; int responseSize = stream.Read(buffer, 0, buffer.Length); if (responseSize == maxResponseSize) throw new Exception("Совсем охренели, в буфер не влезло"); return WebUtility.HtmlDecode(Encoding.UTF8.GetString(buffer, 0, responseSize)); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д