限制/阻止异步http请求
本文关键字:http 请求 异步 限制 | 更新日期: 2023-09-27 18:29:58
我有许多生产者任务,它们将数据推送到BlockingCollection中,让我们称之为requestQueue。
我还有一个使用者任务,它从requestQueue弹出请求,并将异步http请求转发到远程web服务。
我需要限制或阻止发送到web服务的活动请求的数量。在一些远离服务或互联网连接较慢的机器上,http响应时间足够长,活动请求的数量会占用比我想要的更多的内存。
目前,我使用的是信号量方法,在使用者线程上多次调用WaitOne,在HTTP响应回调上调用Release。有没有更优雅的解决方案?
我已经绑定到.net 4.0,并且想要一个基于库的标准解决方案。
您已经在使用BlockingCollection
了,为什么要使用WaitHandle
?
我的方法是使用BlockingCollection
和n
,因为它是有界容量,其中n
是在任何给定时间想要的最大并发请求数。
然后你可以做一些类似…的事情。。。。
var n = 4;
var blockingQueue = new BlockingCollection<Request>(n);
Action<Request> consumer = request =>
{
// do something with request.
};
var noOfWorkers = 4;
var workers = new Task[noOfWorkers];
for (int i = 0; i < noOfWorkers; i++)
{
var task = new Task(() =>
{
foreach (var item in blockingQueue.GetConsumingEnumerable())
{
consumer(item);
}
}, TaskCreationOptions.LongRunning | TaskCreationOptions.DenyChildAttach);
workers[i] = task;
workers[i].Start();
}
Task.WaitAll(workers);
我让您负责取消和错误处理,但使用此功能,您还可以控制在任何给定时间想要有多少工作人员,如果工作人员忙于发送和处理请求,则任何其他生产者都将被阻止,直到队列中有更多空间可用。