C# 我是否应该利用多个HttpClient进行批量异步GET请求?
我有一个场景,在这个场景中,我需要在尽可能短的时间内发出大量GET请求(大约1000个) 我知道,一般来说,最好只保留一个客户端,并尽可能多地重用它:C# 我是否应该利用多个HttpClient进行批量异步GET请求?,c#,http,get,C#,Http,Get,我有一个场景,在这个场景中,我需要在尽可能短的时间内发出大量GET请求(大约1000个) 我知道,一般来说,最好只保留一个客户端,并尽可能多地重用它: // Create Single HTTP Client HttpClient client = new HttpClient(); // Create all tasks for (int x = 0; x < 1000; x++) { tasks.Add(ProcessURLAsync($"https://someapi.co
// Create Single HTTP Client
HttpClient client = new HttpClient();
// Create all tasks
for (int x = 0; x < 1000; x++)
{
tasks.Add(ProcessURLAsync($"https://someapi.com/request/{x}", client, x));
}
// wait for all tasks to complete.
Task.WaitAll(tasks.ToArray());
...
static async Task<string> ProcessURLAsync(string url, HttpClient client, int x)
{
var response = await client.GetStringAsync(url);
ParseResponse(response.Result, x);
return response;
}
//创建单个HTTP客户端
HttpClient=新的HttpClient();
//创建所有任务
对于(int x=0;x<1000;x++)
{
tasks.Add(ProcessURLAsync($)https://someapi.com/request/{x} “,客户,x”);
}
//等待所有任务完成。
Task.WaitAll(tasks.ToArray());
...
静态异步任务ProcessURLAsync(字符串url,HttpClient客户端,int x)
{
var response=await client.GetStringAsync(url);
ParseResponse(response.Result,x);
返回响应;
}
但完成所有请求大约需要70秒
另一方面,如果我事先创建多个客户端并跨它们分发请求,则完成请求大约需要3秒钟:
// Create arbitrary number of clients
while (clients.Count < maxClients)
{
clients.Add(new HttpClient());
}
// Create all tasks
for (int x = 0; x < 1000; x++)
{
tasks.Add(ProcessURLAsync(
$"https://someapi.com/request/{x}", clients[x % maxClients], x));
}
// Same same code as above
//创建任意数量的客户端
while(clients.Count
由于所请求数据的性质,我需要保持结果的顺序,或者传递与请求相关联的索引
假设无法更改API以更好地格式化请求的数据,并且所有请求都必须在继续之前完成,那么此解决方案是明智的还是缺少更明智的选择
(为了简洁起见,我使用了任意数量的
HttpClient
,而我会创建一个HttpClient
池,一旦收到响应就会释放客户端,并且只有在没有响应时才创建一个新的客户端)我建议两个主要更改
我建议进行两项主要修改
@mjwills谢谢,我刚刚意识到我的愚蠢,我一直在尝试内联分析数据,因为我假设我的结果超出了范围,而所有内容都仍然在我的任务列表中。让我重构这段代码,我会回复你的。@mjwills谢谢你,我刚刚意识到我的愚蠢,我一直在尝试内联分析数据,因为我假设我的结果超出了范围,而所有内容都在我的任务列表中。让我重构这段代码,我会回复你的。这个DefaultConnectionLimit让我很开心,终于:D这个DefaultConnectionLimit让我很开心,终于:D