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

时间:2017-12-30 15:46:08

标签: 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.ToLongTimeString()}: start");
    await Task.Delay(10000);
    System.Diagnostics.Trace.WriteLine($"{guid}: {DateTime.Now.ToLongTimeString()}: end");
    return "hello";
}

如果我通过多次刷新从Chrome调用端点,我看到它们在我点击刷新后立即执行,并且我在10秒后收到响应:

39a20541-a2d6-4cd0-99cd-db0987e273e9: 5:32:44 PM: start
8326d829-28a6-48a2-9874-6506b79488af: 5:32:44 PM: start
aecfbb10-266c-46f8-be3b-bfc2fadf0775: 5:32:44 PM: start
78932f53-37a5-4f26-a56f-b3196256e1cf: 5:32:44 PM: start
39a20541-a2d6-4cd0-99cd-db0987e273e9: 5:32:54 PM: end
8326d829-28a6-48a2-9874-6506b79488af: 5:32:54 PM: end
aecfbb10-266c-46f8-be3b-bfc2fadf0775: 5:32:54 PM: end
78932f53-37a5-4f26-a56f-b3196256e1cf: 5:32:54 PM: end

但是如果我在控制台应用程序中使用此代码进行调用:

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

我看到Console.ReadKey();立即到达,但请求是两个两个执行 - 它发出2个请求,然后等待10秒完成,然后再等待2个,另外10秒等等,即使所有据说已安排了10个。

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
....

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

1 个答案:

答案 0 :(得分:7)

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

  

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

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

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