【发布时间】:2021-02-14 12:52:51
【问题描述】:
我使用 HTTPClient(C#、.NET Core 3.1)向不同的主机发送许多请求。
当我的代码发送了 100-200 个请求时,下一个请求开始变得很慢。
我尝试了两种使用 HTTPClient 的方法 - 静态并为每个请求创建新的。我也在测试 HTTPClient 的配置。 我测试了一个任务和更多的请求。
我将每个请求 ConnectionLeaseTimeout 设置为 1、2、3、10 秒。
我尝试将 Timeout 添加到客户端并将 ConnectTimeout 添加到 SocketsHttpHandler。
我添加了处理响应。
我当前的代码:
static async Task<string> Request(string domain)
{
string result = null;
string url = $"http://{domain}/";
var sp = ServicePointManager.FindServicePoint(new Uri(url));
sp.ConnectionLeaseTimeout = 3 * 1000;
HttpResponseMessage response = await HttpClient.GetAsync(url);
try
{
result = await response.Content.ReadAsStringAsync();
}
catch (Exception ex) when (ex is OperationCanceledException || ex is TaskCanceledException)
{
Console.Beep();
}
finally
{
response.Dispose();
}
return result;
}
static void Test()
{
SocketsHttpHandler socketsHandler = new SocketsHttpHandler
{
ConnectTimeout = TimeSpan.FromSeconds(5)
};
HttpClient = new HttpClient(socketsHandler);
LoadDomains("Domains.txt");
for (int i = 0; i < 50; i++)
{
if (Domains.Count != 0)
Task.Run(async () =>
{
ActiveThreads++;
while (Domains.Count != 0)
{
await Request(Domains.Dequeue());
CheckedDomains++;
}
ActiveThreads--;
});
}
}
static HttpClient HttpClient;
我还注意到套接字没有被重复使用。
@UPDATE 我现在看到有什么东西帮助了我。 我注意到无论我加载 200 或 500 或 1000 个 url,每次在 90% 的请求后它变得非常慢。最后 10% 非常慢。
下一个问题是当我设置Client.DefaultProxy时,每个请求都会变慢。
【问题讨论】:
-
你确定不是服务器变慢了吗?另外:您应该使用
TryDequeue,因为您当前的出队受竞争条件的影响。您应该将HttpResponseMessage放入using而不是try/finally -
将docs.microsoft.com/en-us/dotnet/api/… 设置为200 有帮助吗?
-
你为什么使用
Task.Run?还要注意ActiveThreads++;不是线程安全的。
标签: c# http tcp httpclient