Много инстансов HttpClient с прокси - PullRequest
0 голосов
/ 03 апреля 2019

нужна твоя помощь.

Не могу понять, как правильно использовать HttpClient в разных потоках с разными обработчиками?Мне нужно, чтобы каждый мой поток работал с HttpClient с разными прокси за один раз (около 300 потоков).Я прочитал много страниц - я должен использовать один HttpClient, не создавая новых экземпляров.Но как я могу использовать его с разными httpclienthandlers?

Теперь я создаю новые экземпляры с каждым новым прокси, и это увеличивает утечку памяти.Использование, избавление не помогает ... Простой пример:

public void start_parallel()
    {
        List<int> start = new List<int>();
        int gg = 0;
        while (gg != 30000)
        {
            gg += 1;
            start.Add(gg);
        }
        while (true)
        {


            Parallel.ForEach(start, new ParallelOptions() { MaxDegreeOfParallelism = 300 }, (s) => worker(s));
            Thread.Sleep(1000);
            GC.Collect();
            Thread.Sleep(1000);
        }

    }

public void worker(int i)
{
      using (var http_client = new HttpClient(handler)
      {
           await http_client.PostAsync(url, data);
      };
};

Что я делаю не так?

Спасибо!

1 Ответ

0 голосов
/ 03 апреля 2019

Я предлагаю использовать HttpClientFactory вместо того, чтобы вручную создавать HttpClient экземпляры. Это решает большинство проблем с HttpClient. цитирование документов:

В качестве первой проблемы, хотя этот класс является одноразовым, использование его с оператором using - не лучший выбор, поскольку даже при удалении объекта HttpClient базовый сокет не освобождается немедленно и может вызвать серьезную проблему с именем «исчерпание сокетов». ». Дополнительные сведения об этой проблеме см. В разделе «Вы неправильно используете HttpClient, и это дестабилизирует ваш пост в программном обеспечении».

[...]

Но есть и вторая проблема с HttpClient, которая возникает при использовании его в качестве одноэлементного или статического объекта. В этом случае одноэлементный или статический HttpClient не учитывает изменения DNS, как объясняется в этом выпуске репозитория .NET Core GitHub.

Больше на https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests

И чтобы ответить на ваш вопрос: вы допустили ошибку, описанную в пункте 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...