Переполнение стека - C# (190561)

Узнай цену своей работы

Формулировка задачи:

Проблема в следующем, есть программа, которая должна многопоточно перебирать списки сайтов, запросы реализованы следующим образом:
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;
    }
В потоках просто происходит вызов этой функции и обработка полученного содержимого. Вот несколько скриншотов с утилиты dotMemory: Как видно, переполняется область Heap Generation 2, а, в частности, типами данных Char[] и StringBuilder. Проблема в том, что у меня нет типа данных StringBuilder или Char[] в коде, я использую String и List() . Подозреваю на код внутри класса HttpWebRequest, не знаю просто на что уже другое думать. Просто происходит рост занятой оперативной памяти до зависания приложения. Буду благодарен за помощь!

Решение задачи: «Переполнение стека»

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));
                }
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5