繁体   English   中英

节气门/阻止异步HTTP请求

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM