gpt4 book ai didi

.NET 的 HttpClient 限制

转载 作者:行者123 更新时间:2023-12-04 15:46:16 27 4
gpt4 key购买 nike

我正在开发一个基于 .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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com