0

Приложение запускает несколько потоков с бесконечными циклами, которые выполняют sql и web запросы, при работе используемая память бесконечно увеличивается. Не понимаю из-за чего, предполагаю, что проблема именно в web запросах. Вот снимок кучи и метод который используется в циклах, для выполнения запроса через прокси если тот имеется. к

        public static async Task<string> GETOrProxy(string url, string[] proxy)
        {
            string result = null;
            try
            {
                if (proxy[0] != "" && proxy[0] != null)
                {
                WebProxy Proxy = new WebProxy
                {
                    Address = new Uri($&quot;http://{proxy[0]}:{proxy[1]}&quot;),
                    BypassProxyOnLocal = false,
                    UseDefaultCredentials = false,

                    Credentials = new NetworkCredential(
                    userName: proxy[2],
                    password: proxy[3])
                };
                var httpClientHandler = new HttpClientHandler{Proxy = Proxy};
                using var client = new HttpClient(handler: httpClientHandler, disposeHandler: true);
                var response = await client.GetStringAsync(url);
                result = Convert.ToString(response);
                httpClientHandler.Dispose();
            }
            else
            {

                using var client = new HttpClient();
                var response = await client.GetStringAsync(url);
                result = Convert.ToString(response);
            }
        }
        catch 
        {

            result = null;
        }


        return result;
    }

Kurama
  • 25
  • Версию дотнета скажите. И несколько потоков с бесконечными циклами не вижу ни одного потока и ни одного цикла у вас в коде. Нужен воспроизводимый пример. Могу сказать только 2 вещи: 1 и то что не надо пересоздавать клиент для одной и той же прокси. А если без прокси, то и вовсе одного клиента хватит. Документацию по HttpClient хоть раз читали? HttpClient is intended to be instantiated once per application, rather than per-use. – aepot May 21 '22 at 10:18
  • Посмотрел скрин подробнее, судя по всему, это устаревший .NET Framework 4.x, используйте .NET 6, если хотите производительности и контролируйте количество одновременно работающих клиентов, тогда не будет проблем с памятью. – aepot May 21 '22 at 10:33
  • @aepot .NET 6, одновременно работают 10 потоков, это максимум 10 клиентов(одновременно). Разве это может привести к бесконечному потреблению? Доходило до 28гб, разве после закрытия клиента вся использованная им память не освобождается? – Kurama May 21 '22 at 11:02
  • Ограничение работает не на количество создаваемых оъектов, а на количество установленных соединений. – aepot May 21 '22 at 11:04
  • Я создал тестовый проект, и через тот же метод запустил цикл с 1 потока - всё нормально память не увеличивается, запускаю 2 идентичный поток - память начинает медленно расти. это о чём-то говорит? – Kurama May 21 '22 at 14:24
  • Это говорит о том, что вам нужен пул клиентов, фабрика, которая будет кешировать клиенты с одинаоковыми проксями, а не создавать их каждый раз заново. – aepot May 21 '22 at 14:25
  • А нет, несколько потоков занимают в разы больше памяти, но не бесконечно. – Kurama May 21 '22 at 16:09

1 Answers1

0

Я избавился от создания нового HttpClient для каждого запроса и проблема ушла. Насчёт прокси - я работаю с разными аккаунтами(для каждого свой прокси) и теперь для каждого аккаунта создаётся свой httpclient, если у аккаунта нет прокси - client создаётся без handler. И этот клиент уже отправляется в метод запроса.

Kurama
  • 25