需要您的帮助。
我不明白,这是在具有不同处理程序的不同线程中使用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);
};
};
我做错了什么?
谢谢!
答案 0 :(得分:0)
我建议使用HttpClientFactory
而不是手动创建HttpClient
实例。
它解决了HttpClient
的大多数问题。引用文档:
作为第一个问题,尽管此类是可抛弃的,但与using语句一起使用不是最佳选择,因为即使处置HttpClient对象,底层套接字也不会立即释放,并且可能导致严重的问题,称为“套接字耗尽”。 '。有关此问题的更多信息,请参见您使用的HttpClient错误,并破坏了软件博客文章的稳定性。
[...]
但是,将HttpClient用作单例或静态对象时可能会遇到第二个问题。在这种情况下,如.NET Core GitHub存储库中的此问题所述,单例或静态HttpClient不考虑DNS更改。
更多{@ {3}}
并回答您的问题:您犯了第一点中描述的错误。