Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我是否应该利用多个HttpClient进行批量异步GET请求?_C#_Http_Get - Fatal编程技术网

C# 我是否应该利用多个HttpClient进行批量异步GET请求?

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

我有一个场景,在这个场景中,我需要在尽可能短的时间内发出大量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.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
池,一旦收到响应就会释放客户端,并且只有在没有响应时才创建一个新的客户端)

我建议两个主要更改

  • 删除等待,以便可以同时进行多个下载 时间
  • 设置为较大的数字(例如50)

  • 我建议进行两项主要修改

  • 删除等待,以便可以同时进行多个下载 时间
  • 设置为较大的数字(例如50)

  • @mjwills谢谢,我刚刚意识到我的愚蠢,我一直在尝试内联分析数据,因为我假设我的结果超出了范围,而所有内容都仍然在我的任务列表中。让我重构这段代码,我会回复你的。@mjwills谢谢你,我刚刚意识到我的愚蠢,我一直在尝试内联分析数据,因为我假设我的结果超出了范围,而所有内容都在我的任务列表中。让我重构这段代码,我会回复你的。这个DefaultConnectionLimit让我很开心,终于:D这个DefaultConnectionLimit让我很开心,终于:D