C# HttpClient.GetAsync一次只执行2个请求?

C# HttpClient.GetAsync一次只执行2个请求?,c#,asynchronous,async-await,dotnet-httpclient,C#,Asynchronous,Async Await,Dotnet Httpclient,为什么HttpClient.GetAsync()/PostAsync()/SendAsync()等一次只调度2个请求 我通过以下方式对此进行了测试: 我有一个异步GET方法,它在响应之前无阻塞地等待10秒 public async Task<string> Get() { var guid = Guid.NewGuid(); System.Diagnostics.Trace.WriteLine($"{guid}: {DateTime.Now.ToLongTimeStr

为什么HttpClient.GetAsync()/PostAsync()/SendAsync()等一次只调度2个请求

我通过以下方式对此进行了测试:

我有一个异步GET方法,它在响应之前无阻塞地等待10秒

public async Task<string> Get()
{
    var guid = Guid.NewGuid();
    System.Diagnostics.Trace.WriteLine($"{guid}: {DateTime.Now.ToLongTimeString()}: start");
    await Task.Delay(10000);
    System.Diagnostics.Trace.WriteLine($"{guid}: {DateTime.Now.ToLongTimeString()}: end");
    return "hello";
}
但如果我在控制台应用程序中使用此代码进行调用:

var client = new HttpClient();
for (var ii = 0; ii < 10; ii++)
{
    client.GetAsync("http://localhost:50621/api/default");
}
Console.ReadKey();

那么,为什么不立即提出所有请求呢?HttpClient是否对挂起的请求有某种限制?

HttpClient
以及其他http相关类使用服务点进行http连接管理:

ServicePoint类处理到Internet资源的连接 基于在资源的统一目录中传递的主机信息 资源标识符(URI)。与资源的初始连接 确定ServicePoint对象维护的信息, 然后由对该资源的所有后续请求共享

存在
ServicePointManager.DefaultConnectionLimit
静态属性,该属性控制
ServicePoint
对象允许的默认最大并发连接数,默认情况下该属性的值为2

这意味着默认情况下,您只能有2个到给定主机的并发连接。要“修复”这个问题,通常在应用程序启动时,将这个数字增加到某个更大的值

var client = new HttpClient();
for (var ii = 0; ii < 10; ii++)
{
    client.GetAsync("http://localhost:50621/api/default");
}
Console.ReadKey();
80546610-c20e-4ff1-b6e5-0fe1688e8803: 5:39:10 PM: start
9bbbb707-9ea7-44da-9d5b-03efc3c4aa47: 5:39:10 PM: start
80546610-c20e-4ff1-b6e5-0fe1688e8803: 5:39:20 PM: end
9bbbb707-9ea7-44da-9d5b-03efc3c4aa47: 5:39:20 PM: end
a146c3ca-a0d2-4588-b60b-156f1febc944: 5:39:20 PM: start
b71bc77f-9bdb-4aa6-936e-c702eb7d49eb: 5:39:20 PM: start
....