如何确定执行期间来自异步 httpclient 的并发请求数?

Posted

技术标签:

【中文标题】如何确定执行期间来自异步 httpclient 的并发请求数?【英文标题】:How do I determine the number of concurrent requests from an async httpclient during execution? 【发布时间】:2012-10-22 14:54:54 【问题描述】:

我有一个简单的控制台应用程序,如下所示:

    private static StringBuilder sb = new StringBuilder();
    private static HttpClient client = new HttpClient();

    private static async Task<HttpStatusCode> AccessTheWebAsync()
                
        HttpResponseMessage response = await client.GetAsync("http://www.google.com").ConfigureAwait(false);
        return response.StatusCode;
    

    static void Main(string[] args)
    
        Stopwatch sw = new Stopwatch();
        sw.Start();
        List<Task> tasks = new List<Task>();
        for (int i = 0; i < 10; i++)
            tasks.Add(AccessTheWebAsync());
        Task.WaitAll(tasks.ToArray());

        foreach (Task<HttpStatusCode> t in tasks)
            sb.Append((int)t.Result).Append(Environment.NewLine);
        Console.WriteLine(sb.ToString());            
        sw.Stop();
        Console.WriteLine("Run Completed, Time elapsed: 0", sw.Elapsed);
        Console.ReadLine();
    

这里我发起 10 个异步 Web 请求,并在请求完成时收集响应代码并列出它们。

    问题:是否可以使用 VS2012 来调试应用程序,以便我可以确定在执行期间任何给定时间点发生的并发 Web 请求的数量?

原因是我发现您可以在 App.config 上更改某些内容:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <system.net>
    <connectionManagement>
      <add address = "*" maxconnection = "10" />
    </connectionManagement>
  </system.net>
</configuration>

但是,我没有一个很好的方法来确定这是否真的有效。

    服务器是否设置了此限制?

    操作系统是否设置了这个限制?

    此应用配置和/或 .NET 是否设置了此限制?

【问题讨论】:

并不是说你现在所做的有什么问题,只是仅供参考,HttpClient 可以单独用于多个并发调用 - 你不需要 N 个不同的实例用于 N 个不同的调用。 @JamesManning 好的,我把它变成了一个字段。谢谢! 您的目标是以编程方式跟踪(例如,在 UI 中显示)还是只是为了验证预期行为? 澄清一下 - 如果只是为了查看行为,我会使用并信任 Fiddler 而不是应用程序本身内部的任何东西。 :) 尝试查看可以同时发出多少个 GET 请求,但我不知道这个限制在哪里施加。 【参考方案1】:

是否可以使用 VS2012 来调试应用程序 可以确定正在发生的并发 Web 请求的数量 在执行期间的任何给定时间点?

是的,当然。使用Parallel Tasks 和Parallel Stacks windows,它们非常好。

    服务器是否设置了此限制?

    操作系统是否设置了这个限制?

    此应用配置和/或 .NET 是否设置了此限制?

该设置指定the maximum number of connections to a network host,可以在机器或应用程序级别进行设置。服务器也可以为客户端设置连接限制,但这与maxconnection 属性无关。

在您的示例中,实际最大连接数也可能受到线程池设置的限制。请查看this KB entry 了解更多详情。

【讨论】:

【参考方案2】:

使用静态 int 变量并使用互锁增量/减量。 http://msdn.microsoft.com/de-de/library/vstudio/dd78zt0c.aspx

【讨论】:

以上是关于如何确定执行期间来自异步 httpclient 的并发请求数?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据来自另一个线程的 JSON 结果确定是不是执行 segue

使用 Windows.Web.Http.HttpClient 类 PATCH 异步请求

AsyncTask 中的httpClient 需要wakeLock 吗?

meteor.js - 如何检查来自异步回调的值

Web Api + HttpClient:异步模块或处理程序已完成,而异步操作仍处于挂起状态

如何将异步服务用于角度 httpClient 拦截器