Squeak.ru - шаблоны программирования

Быстро растущее использование памяти C#

У меня есть код, который в основном открывает файл веб-страницы + .ts по ссылке и повторяет его, но проблема в том, что он каждый раз увеличивает использование памяти и никогда не удаляет старые данные. Через 2 часа он использует более 2 ГБ. Любые идеи о том, как я могу решить эту проблему?

Я использую библиотеку Leaf.Xnet для запросов, и вот как я создаю свои потоки:

new Thread(new ThreadStart(WebHelper.Check)).Start();

Основной код:

public static void Check()
{
    HttpRequest request = null;

    while (Form1.isRuning)
    {
        Application.DoEvents();

        try
        {
            request = new HttpRequest();
            if (!ProxyManager.updating)
            {
                switch (ProxyManager.curProxyType)
                {
                    case ProxyManager.proxyType.http:
                        request.Proxy = HttpProxyClient.Parse(ProxyManager.NextProxy(ProxyManager.proxyType.http));
                        break;
                    case ProxyManager.proxyType.socks4:
                        request.Proxy = Socks4ProxyClient.Parse(ProxyManager.NextProxy(ProxyManager.proxyType.socks4));
                        break;
                    case ProxyManager.proxyType.socks5:
                        request.Proxy = Socks5ProxyClient.Parse(ProxyManager.NextProxy(ProxyManager.proxyType.socks5));
                        break;
                }
            }
            else
            {
                Thread.Sleep(2000);
                Check();
            }

           request.UserAgentRandomize();
           request.AddHeader(HttpHeader.Referer, "https://somesite.com");
           request.KeepAlive = true;
           request.ConnectTimeout = Form1.timeOut;
           request.Reconnect = true;
           string html = request.Get(Form1.link, null).ToString();
           string auth = html.Substring(",[{\"src\":\"", "\"");
           string sign = html.Substring("144p.apt?wmsAuthSign=", "\"");

           if (auth != null && sign != null)
           {
               string auth2 = "";
               foreach (char item in auth)
               {
                   if (item != '\\')
                       auth2 += item;
               }

               auth = auth2;
               string cdn = auth.Substring("https://", ".");
               string id = auth.Substring("video/", "-");
               if (cdn != null && id != null)
               {
                   Random rnd = new Random();
                   request.Get(auth);
                   Form1.sended++;
                   WriteStat();
               }
               html = null;
               auth = null;
               auth2 = null;
               sign = null;
           }
        }
        catch (HttpException)
        {
            Check();
        }
        catch (ProxyException)
        {
            Check();
        }
    }
}

  • Вы вызываете метод рекурсивно в случае ошибок. Это странно. 13.08.2020
  • @Sinatr в случае ошибки HTTP или ошибки прокси-сервера, он будет использовать другой прокси-сервер, и это будет исправлено. 13.08.2020
  • Rapidlt ‹=== это опечатка в названии? 13.08.2020

Ответы:


1

Я не совсем уверен, решит ли это вашу проблему, но для каждого потока, который вы запускаете, вы в значительной степени вызываете бесконечное количество выполнений Check(). Поскольку Check содержит цикл while, поток все равно будет выполнять все, что находится внутри, навсегда, и теперь вы снова вызываете метод поверх него. Это означает, что все, что было создано в рамках метода Check, не будет собирать мусор и увеличит вашу память.

Замените все вызовы Check() на continue, что остановит выполнение в цикле while и начнет сначала.

Кроме того, подумайте о том, чтобы не использовать потоки, а вместо этого использовать задачи.

Также вы не распоряжаетесь своим HttpRequest.

13.08.2020
  • Ну замена Calls на continue; исправлена ​​проблема, производительность немного снизилась, но это по лучшему делу. и не могли бы вы подсказать мне, как избавиться от HttpRequest, я понятия не имею 13.08.2020
  • Если вы используете последнюю версию C#, вы можете просто поставить using перед объявлением переменной. Удалите HttpRequest request = null; и поместите вместо него using var request = new HttpRequest(); там, где вы сейчас создаете новый HttpRequest. Нанесение using на что-либо автоматически позаботится об одноразовом шаблоне. Обратите внимание, что вы можете вручную удалить все, что является одноразовым (= не собирает мусор автоматически), просто вызвав .Dispose() для объекта. 13.08.2020
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...