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