[英]Throttle/block async http request
我有许多生产者任务,可以将数据推送到BlockingCollection中,我们称之为requestQueue。
我还有一个使用者任务,该任务从requestQueue弹出请求,并将异步http请求转发到远程Web服务。
我需要限制或阻止发送到Web服务的活动请求的数量。 在远离服务或互联网连接较慢的某些计算机上,http响应时间足够长,以至于活动请求的数量会填满比我想要的更多的内存。
目前,我正在使用信号量方法,在使用者线程上多次调用WaitOne,并在HTTP响应回调上释放。 有没有更优雅的解决方案?
我绑定到.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);
我让您处理取消和错误处理,但是使用此方法,您还可以控制在任何给定时间想要拥有多少个工人,如果这些工人忙于发送和处理请求,则将阻止其他任何生产者,直到有更多可用空间为止在队列中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.