很多实例通过代理实例化HttpClient

时间:2019-04-03 06:36:17

标签: c# multithreading memory-leaks httpclient

需要您的帮助。

我不明白,这是在具有不同处理程序的不同线程中使用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 :(得分:0)

我建议使用HttpClientFactory而不是手动创建HttpClient实例。 它解决了HttpClient的大多数问题。引用文档:

  

作为第一个问题,尽管此类是可抛弃的,但与using语句一起使用不是最佳选择,因为即使处置HttpClient对象,底层套接字也不会立即释放,并且可能导致严重的问题,称为“套接字耗尽”。 '。有关此问题的更多信息,请参见您使用的HttpClient错误,并破坏了软件博客文章的稳定性。

     

[...]

     

但是,将HttpClient用作单例或静态对象时可能会遇到第二个问题。在这种情况下,如.NET Core GitHub存储库中的此问题所述,单例或静态HttpClient不考虑DNS更改。

更多{@ {3}}

并回答您的问题:您犯了第一点中描述的错误。