.NET 的 HttpClient 限制

标签 .net async-ctp throttling dotnet-httpclient

我正在开发一个基于 .NET4 的应用程序,它必须请求第三方服务器才能从他们那里获取信息。我正在使用 HttpClient 发出这些 HTTP 请求。

我必须在短时间内创建一百或一千个请求。我想将这些请求的创建限制在一个限制(由常量或其他东西定义),以便其他服务器不会收到大量请求。

我查过 this link out 显示了如何减少随时创建的任务量。

这是我的非工作方法:

// create the factory
var factory = new TaskFactory(new LimitedConcurrencyLevelTaskScheduler(level));

// use the factory to create a new task that will create the request to the third-party server
var task = factory.StartNew(() => {
    return new HttpClient().GetAsync(url);
}).Unwrap();

当然,这里的问题是,即使创建了当时的一个任务,也会同时创建和处理很多请求,因为它们运行在另一个调度程序中。我找不到将调度程序更改为 HttpClient 的方法。

我该如何处理这种情况?我想将创建的请求数量限制为某个限制,但不要阻止等待这些请求完成。

这可能吗?有任何想法吗?

最佳答案

如果您可以使用 .Net 4.5,一种方法是使用 TransformBlock 来自 TPL Dataflow 并设置其 MaxDegreeOfParallelism .就像是:

var block = new TransformBlock<string, byte[]>(
    url => new HttpClient().GetByteArrayAsync(url),
    new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = level });

foreach (var url in urls)
    block.Post(url);

block.Complete();

var result = new List<byte[]>();

while (await block.OutputAvailableAsync())
    result.Add(block.Receive());

还有另一种看待这个的方式,通过 ServicePointManager .使用该类,您可以对 MaxServicePoints 设置限制(您可以同时连接多少台服务器)和 DefaultConnectionLimit (每个服务器可以有多少个连接)。这样,您就可以开始所有 Task s 在同一时刻,但只有有限数量的人会真正做某事。虽然限制了Task的数量s(例如,通过使用 TPL 数据流,正如我上面建议的那样)很可能更有效。

关于.NET 的 HttpClient 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13618454/

相关文章:

c# - Azure 是否限制了我的 WebApi?

RxJS 限制相同的值但让新值通过

google-chrome-devtools - 是否可以在 Chrome DevTools 中设置自定义 CPU throttle ?

c# - 在 C# 中嵌入 IronPython 时出现问题(缺少编译器所需的成员 'Microsoft.CSharp.RuntimeBinder.Binder.InvokeMember'

c# - EPPlus 不保存对工作表的更改

c# - 异步 CTP - 环境 CancellationToken 和 IProgress

c# - 异步快速路径

c# - 为什么这个线程方法需要 900 毫秒才能完成?

c# - 打开表单时出现 ShowDialog 问题

c# - 异步ctp递归