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