c# - 如何限制与 Async HttpClient C# 的连接

标签 c# http connection dotnet-httpclient servicepointmanager

我正在尝试限制与端点之间的最大连接数,我通过设置 ServicePointManager.DefaultConnectionLimit 来执行此操作,但它不起作用。为了对此进行测试,我设置了一个休眠 5 秒然后返回的端点。

这是我的代码:

class Program
{
    private static Uri uri = new Uri("http://myservice.com?sleepForMillisecond=5000"));

    static void Main(string[] args)
    {
        ServicePointManager.DefaultConnectionLimit = 1;
        MainAsync().Wait();
    }

    static async Task MainAsync()
    {
        var watch = Stopwatch.StartNew();
        var tasks = new List<Task>()
            {
                Task.Run(async () => await MakeCallWithHttpClient()),
                Task.Run(async () => await MakeCallWithHttpClient()),
                Task.Run(async () => await MakeCallWithHttpClient())
            };

        await Task.WhenAll(tasks);
        watch.Stop();
        Console.WriteLine("Elapsed Time For HttpClient: " + watch.Elapsed);

        watch.Restart();
        tasks = new List<Task>()
            {
                Task.Run(async () => await MakeCallWithWebClient()),
                Task.Run(async () => await MakeCallWithWebClient()),
                Task.Run(async () => await MakeCallWithWebClient())
            };

        await Task.WhenAll(tasks);
        watch.Stop();
        Console.WriteLine("Elapsed Time For WebClient: " + watch.Elapsed);
        Console.WriteLine("Press Enter To Exit.");
        Console.ReadLine();
    }

    private static async Task MakeCallWithHttpClient()
    {
        var client = new HttpClient();
        await client.GetStringAsync(uri);
        Console.WriteLine("Done");
    }

    private static async Task MakeCallWithWebClient()
    {
        var client = new WebClient();
        await client.DownloadStringTaskAsync(uri);
        Console.WriteLine("Done");
    }
} 

下面是输出:

Done
Done
Done
Elapsed Time For HttpClient: 00:00:05.0953943
Done
Done
Done
Elapsed Time For WebClient: 00:00:15.0450096

如您所见,异步 HttpClient 不受最大连接数 1 的限制,因为并行调用 3 次需要 5 秒,而异步 WebClient 受连接数 1 的限制,因为并行调用 3 次需要 15 秒。

我的问题是...如何使用异步 HttpClient 限制最大连接数?

谢谢。

最佳答案

对所有请求使用相同的 HttpClient 实例,连接限制将按预期工作。

关于c# - 如何限制与 Async HttpClient C# 的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24904719/

相关文章:

c# - 如何确保某些方法和字段仅对子类可见?

c# - 获取小数点的最后(即结尾)3 位数字 (.NET)

c# - 在 ASP.NET Core ApiController 中区分显式 'null' 和 'not specified'

javascript - Node.JS,服务器在请求过程中关闭 Keep-Alive 连接

javascript - 如何从 Angularjs 模块调用 JSON 文件

java - Mongo打开了太多的连接

c# - 在C#中,使用WebKitBrowser,如何获取HTML?

javascript - 对预检请求的响应未通过访问控制检查

iphone - 如何在 iPhone 上从 URL 接收数据?

connection - 无法创建 Genymotion 虚拟设备 :Connection timeout